Consultas SQL: Cómo Filtrar y Ordenar Datos Específicos

Clase 7 de 21Curso de Backend con Rust: Bases de Datos, Controladores y Templates

Resumen

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() {
    // ...

    // SELECT * FROM posts;
    println!("Consulta básica");
    let posts_result = posts.load::<Post>(&conn).expect("Error en la consulta SQL.");

    // Iteramos los resultados de la consulta
    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() {
    // ...

    // SELECT * FROM posts LIMIT 1;
    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() {
    // ...

    // SELECT * FROM posts ORDER BY id LIMIT 1;
    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() {
    // ...

    // SELECT title, body FROM posts WHERE id = 2;
    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.

// Estructura para obtener registros parciales de la BBDD
// Utilizamos 'Debug' para hacer un 'println!("{:?}", post);' y visualizar todo el objeto y no campo por campo
#[derive(Queryable, Debug)]
pub struct PostSimplificado {
    pub title: String,
    pub body: String,
}
fn main() {
    // ...
    
    // No olvides importar la nueva estructura
    use self::models::{PostSimplificado};

    // SELECT title, body FROM posts;
    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.