0Pricing
Learn Rust Coding · Lección

Operaciones CRUD

Consultar y ejecutar

Operaciones CRUD es una lección gratuita de Learn Rust Coding en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Learn Rust Coding, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Learn Rust Coding incluye 4 lecciones en total.

CRUD con sqlx

CRUD significa Create, Read, Update, Delete (crear, leer, actualizar y eliminar). sqlx divide estas operaciones en dos estilos de ejecución:

  • fetch_* para consultas que devuelven filas
  • execute para instrucciones que modifican datos

Crear (INSERT)

Inserte una fila con parámetros vinculados y ejecútela mediante execute. Use RETURNING para recuperar el id generado.

use sqlx::{Pool, Postgres};

async fn create(pool: &Pool<Postgres>, name: &str) -> i32 {
    let rec = sqlx::query!(
        "INSERT INTO users (name) VALUES ($1) RETURNING id",
        name
    ).fetch_one(pool).await.unwrap();
    rec.id
}

Leer una fila

fetch_one espera exactamente una fila y produce un error en caso contrario. Use fetch_optional cuando la fila pueda no existir.

use sqlx::{Pool, Postgres};

async fn find(pool: &Pool<Postgres>, id: i32) -> Option<String> {
    let rec = sqlx::query!("SELECT name FROM users WHERE id = $1", id)
        .fetch_optional(pool)
        .await
        .unwrap();
    rec.map(|r| r.name)
}

Leer varias filas

fetch_all devuelve un Vec con todas las filas coincidentes.

use sqlx::{Pool, Postgres};

async fn all_names(pool: &Pool<Postgres>) -> Vec<String> {
    let rows = sqlx::query!("SELECT name FROM users ORDER BY id")
        .fetch_all(pool)
        .await
        .unwrap();
    rows.into_iter().map(|r| r.name).collect()
}

Actualizar

Las instrucciones UPDATE usan execute, que devuelve un resultado con el número de filas afectadas.

use sqlx::{Pool, Postgres};

async fn rename(pool: &Pool<Postgres>, id: i32, name: &str) -> u64 {
    let res = sqlx::query!("UPDATE users SET name = $1 WHERE id = $2", name, id)
        .execute(pool)
        .await
        .unwrap();
    res.rows_affected()
}

Eliminar

DELETE también usa execute. Compruebe rows_affected() para saber si se eliminó algo.

use sqlx::{Pool, Postgres};

async fn delete(pool: &Pool<Postgres>, id: i32) -> bool {
    let res = sqlx::query!("DELETE FROM users WHERE id = $1", id)
        .execute(pool)
        .await
        .unwrap();
    res.rows_affected() > 0
}

Modelado de CRUD en Rust básico

Implementar CRUD sobre un mapa en memoria refleja las mismas operaciones que sqlx realiza sobre una tabla.

use std::collections::HashMap;

fn main() {
    let mut users: HashMap<i32, String> = HashMap::new();
    users.insert(1, "Alice".to_string());      // create
    println!("{:?}", users.get(&1));            // read
    users.insert(1, "Alicia".to_string());      // update
    println!("{:?}", users.get(&1));
    users.remove(&1);                            // delete
    println!("{:?}", users.get(&1));
}

Transacciones

Agrupe varias instrucciones de forma atómica mediante una transacción. Todas se confirman con commit o no se aplica ninguna.

use sqlx::{Pool, Postgres};

async fn transfer(pool: &Pool<Postgres>) {
    let mut tx = pool.begin().await.unwrap();
    sqlx::query!("UPDATE acct SET bal = bal - 10 WHERE id = 1")
        .execute(&mut *tx).await.unwrap();
    sqlx::query!("UPDATE acct SET bal = bal + 10 WHERE id = 2")
        .execute(&mut *tx).await.unwrap();
    tx.commit().await.unwrap();
}

Revertir cambios

Si se descarta un guardián de transacción sin ejecutar commit, sqlx revierte la transacción automáticamente. También puede llamar a rollback explícitamente.

use sqlx::{Pool, Postgres};

async fn maybe(pool: &Pool<Postgres>, ok: bool) {
    let mut tx = pool.begin().await.unwrap();
    sqlx::query!("INSERT INTO log (msg) VALUES ('x')").execute(&mut *tx).await.unwrap();
    if ok { tx.commit().await.unwrap(); } else { tx.rollback().await.unwrap(); }
}

Leer grandes volúmenes en flujo

Para conjuntos de resultados enormes, fetch devuelve un flujo que permite procesar las filas sin cargarlas todas en memoria.

use sqlx::{Pool, Postgres};
use futures::TryStreamExt;

async fn stream(pool: &Pool<Postgres>) {
    let mut rows = sqlx::query!("SELECT id FROM big_table").fetch(pool);
    while let Some(row) = rows.try_next().await.unwrap() {
        println!("id {}", row.id);
    }
}

Gestionar errores

Las llamadas a la base de datos devuelven Result. Propague los errores con ? en funciones que devuelvan Result<_, sqlx::Error>, en lugar de desenvolverlos.

use sqlx::{Pool, Postgres};

async fn count(pool: &Pool<Postgres>) -> Result<i64, sqlx::Error> {
    let rec = sqlx::query!("SELECT COUNT(*) as n FROM users")
        .fetch_one(pool)
        .await?;
    Ok(rec.n.unwrap_or(0))
}

Comprobación rápida

Compruebe su comprensión de las operaciones CRUD.

Resumen

Ha aprendido CRUD con sqlx:

  • fetch_one, fetch_optional y fetch_all leen filas
  • execute modifica datos e informa de rows_affected()
  • RETURNING recupera valores generados
  • Las transacciones con begin/commit/rollback garantizan la atomicidad

Siguiente: migraciones para evolucionar el esquema.

Preguntas frecuentes

¿La lección «Operaciones CRUD» es gratis?

Sí — el texto completo de «Operaciones CRUD» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Learn Rust Coding, actualiza a CoddyKit PRO. El curso de Learn Rust Coding incluye 4 lecciones en total.

¿Qué aprenderé en «Operaciones CRUD»?

Consultar y ejecutar Practicas Learn Rust Coding con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Learn Rust Coding?

No se requiere experiencia previa. Learn Rust Coding en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Operaciones CRUD»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Learn Rust Coding?

Sí. Cada lección de Learn Rust Coding incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Conexión a una base de datos
  2. Consultas comprobadas en compilación
  3. Operaciones CRUD
  4. Migraciones
← Volver a Learn Rust Coding