Una de las partes más importantes de las bases de datos es la consulta de datos con filtros, condiciones, ordenamiento de la información, etc. Recuerda que uno de los propósitos de este tipo de herramientas es ofrecer información estructurada que se pueda manejar de forma simple.
Consulta de datos con Diesel
Diesel es tan poderoso como SQL. Cualquier consulta que necesites crear con SQL, podrás replicarla con la sintaxis de Diesel. Veamos algunos ejemplos de queries:
Conexión con la base de datos
No olvides, en primer lugar, establecer la conexión con la base de datos:
#[macro_use]
extern crate diesel;
use diesel::prelude::*;
use diesel::pg::PgConnection;
use dotenv::dotenv;
use std::env;
pub mod schema;
pub mod models;
fn main() {
use self::models::{Post, NewPost, PostSimplificado};
use self::schema::posts;
use self::schema::posts::dsl::*;
dotenv().ok();
let db_url = env::var("DATABASE_URL").expect("La variable de entorno DATABASE_URL no existe.");
let conn = PgConnection::establish(&db_url).expect("No se ha podido establecer la conexión con la base de datos.");
}
Seguido a este código, puedes ejecutar consultas como las siguientes:
Consulta básica
La consulta más básica a una tabla. Equivalente a hacer un SELECT * FROM posts;
y traer todos los registros.
fn main() {
println!("Consulta básica");
let posts_result = posts.load::<Post>(&conn).expect("Error en la consulta SQL.");
for post in posts_result {
println!("{}", post.title);
}
}
Consulta con LIMIT
Limitar la cantidad de resultados. Consulta equivalente a SELECT * FROM posts LIMIT 1;
fn main() {
println!("Consulta con limites");
let posts_result = posts.limit(1).load::<Post>(&conn).expect("Error en la consulta SQL.");
for post in posts_result {
println!("{:?}", post);
}
}
Consulta con LIMIT y ORDER BY
Consulta limitando la cantidad de resultados y ordenando los resultados de forma descendente. Equivalente a SELECT * FROM posts ORDER BY id LIMIT 1;
fn main() {
println!("Consulta con limites y ordenado por id");
let posts_result = posts.order(id.desc()).limit(1).load::<Post>(&conn).expect("Error en la consulta SQL.");
for post in posts_result {
println!("{:?}", post);
}
}
Consulta con WHERE
Consulta filtrando datos con WHERE para buscar por un campo y valor específico. Equivalente a SELECT title, body FROM posts WHERE slug = "primer-post";
.
fn main() {
println!("Consulta con WHERE");
let posts_result = posts.filter(slug.eq("primer-post")).load::<Post>(&conn).expect("Error en la consulta SQL.");
for post in posts_result {
println!("{:?}", post);
}
}
Consulta columnas específicas
Consulta donde solo traemos como resultado algunos campos de los registros. Equivalente a SELECT title, body FROM posts;
.
Aquí es necesario primero crear un nuevo modelo para indicarle a Diesel qué campos de la tabla posts
queremos traer.
#[derive(Queryable, Debug)]
pub struct PostSimplificado {
pub title: String,
pub body: String,
}
fn main() {
use self::models::{PostSimplificado};
println!("Consultar columnas especificas");
let posts_result = posts.select((title, body)).load::<PostSimplificado>(&conn).expect("Error en la consulta SQL.");
for post in posts_result {
println!("{:?}", post);
}
}
Estos son solo algunos ejemplos para crear consultas SQL con Diesel. No olvides apoyarte de la documentación oficial para conocer la gran cantidad de posibilidades para crear consultas más complejas y avanzadas.
Contribución creada por: Kevin Fiorentino.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?