Trabajo con bases de datos en Rust: PostgreSQL y MongoDB para principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajo con bases de datos en Rust: PostgreSQL y MongoDB para principiantes

\n\n

Rust es un lenguaje de programación de sistemas moderno que está ganando popularidad gracias a su rendimiento y seguridad. Pero, ¿cómo trabajar con bases de datos en Rust? En este artículo analizaremos la conexión y ejecución de operaciones básicas con dos SGBD populares: PostgreSQL relacional y MongoDB orientada a documentos. El material está dirigido a desarrolladores principiantes familiarizados con los fundamentos de Rust.

\n\n

¿Por qué Rust y las bases de datos son una buena combinación?

\n\n

Rust ofrece un sistema de tipos estricto y garantías de seguridad de memoria, lo que es especialmente valioso al trabajar con datos. Los errores de acceso a memoria, típicos de C/C++, se eliminan en tiempo de compilación. Además, el ecosistema de Rust incluye bibliotecas maduras para la interacción con bases de datos: diesel para PostgreSQL y el controlador oficial para MongoDB.

\n\n

En este artículo aprenderemos a:

\n
    \n
  • Conectarnos a PostgreSQL y MongoDB desde Rust
  • \n
  • Realizar operaciones CRUD (crear, leer, actualizar, eliminar)
  • \n
  • Trabajar con los resultados de las consultas de forma segura y eficiente
  • \n
\n\n

1. Trabajo con PostgreSQL mediante la biblioteca Diesel

\n\n

Diesel es un ORM y query builder para Rust que garantiza la seguridad de tipos en tiempo de compilación. Para empezar, agregue las dependencias en Cargo.toml:

\n\n
[dependencies]\ndiesel = { version = "2.1", features = ["postgres"] }\ndotenvy = "0.15"\nserde = { version = "1.0", features = ["derive"] }\nserde_json = "1.0"\ntokio = { version = "1.0", features = ["full"] }
\n\n

Configuración de la conexión

\n\n

Cree un archivo .env con la URL de su base de datos:

\n\n
DATABASE_URL=postgres://usuario:contraseña@localhost/mibd
\n\n

Ahora escribamos el código para la conexión y creación de una tabla:

\n\n
use diesel::prelude::*;\nuse diesel::pg::PgConnection;\nuse dotenvy::dotenv;\nuse std::env;\n\npub fn establish_connection() -> PgConnection {\n    dotenv().ok();\n    let database_url = env::var("DATABASE_URL")\n        .expect("DATABASE_URL must be set");\n    PgConnection::establish(&database_url)\n        .unwrap_or_else(|_| panic!("Error connecting to {}", database_url))\n}
\n\n

Definición del esquema y modelo

\n\n

Creemos la tabla users y el modelo correspondiente en Rust:

\n\n
// schema.rs\ntable! {\n    users (id) {\n        id -> Int4,\n        name -> Varchar,\n        email -> Varchar,\n        created_at -> Timestamp,\n    }\n}\n\n// models.rs\n#[derive(Queryable, Selectable)]\n#[diesel(table_name = crate::schema::users)]\n#[diesel(check_for_backend(diesel::pg::Pg))]\npub struct User {\n    pub id: i32,\n    pub name: String,\n    pub email: String,\n    pub created_at: chrono::NaiveDateTime,\n}\n\n#[derive(Insertable)]\n#[diesel(table_name = crate::schema::users)]\npub struct NewUser {\n    pub name: String,\n    pub email: String,\n}
\n\n

Operaciones CRUD

\n\n

Ejemplo de creación y lectura de usuarios:

\n\n
use crate::models::{User, NewUser};\nuse crate::schema::users;\n\npub fn create_user(conn: &mut PgConnection, name: &str, email: &str) -> User {\n    let new_user = NewUser {\n        name: name.to_string(),\n        email: email.to_string(),\n    };\n\n    diesel::insert_into(users::table)\n        .values(&new_user)\n        .returning(User::as_returning())\n        .get_result(conn)\n        .expect("Error saving new user")\n}\n\npub fn get_all_users(conn: &mut PgConnection) -> Vec {\n    users::table\n        .load::(conn)\n        .expect("Error loading users")\n}
\n\n

Como puede ver, Diesel verifica los tipos y nombres de las columnas en tiempo de compilación. Un error en el nombre del campo provocará un error de compilación, no un fallo en tiempo de ejecución.

\n\n

2. Trabajo con MongoDB mediante el controlador oficial

\n\n

MongoDB es una base de datos NoSQL que almacena datos en formato JSON-like

Blogs

Book Recommendations