No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Leyendo los registros

7/21
Recursos

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.

Aportes 1

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Una forma alternativa para trabajar con atributos específicos de nuestros datos sería únicamente instanciarlos cuando Rust ya ha obtenido todas las entradas de la DB, un ejemplo muy sencillo sería imprimir en consola únicamente el título y el slug de los Posts con al siguiente línea de código:

println!("El post se llama {} y su slug es {}", post.title, post.slug);

Claramente este método tiene la desventaja de que se descargan todos los atributos de los objetos dentro de la DB aunque no vayan a ser utilizados pero de esta manera ya no es necesario crear una nueva estructura.