Rust y PostgreSQL: un dúo que hace tu código más rápido
\n\n¿Alguna vez te has preguntado por qué cada vez más desarrolladores backend están migrando a Rust? La respuesta es simple: Rust te da control sobre la memoria y la velocidad, mientras que PostgreSQL te da control sobre los datos. Juntos forman una combinación capaz de soportar cargas de cientos de miles de consultas por segundo sin "lentitudes" ni fugas de memoria.
\n\nEn esta guía, exploraremos cómo hacer que Rust y PostgreSQL trabajen juntos. Aprenderás a configurar la conexión, ejecutar consultas, evitar inyecciones SQL y construir aplicaciones asíncronas. ¡Comencemos!
\n\n¿Por qué Rust y PostgreSQL?
\n\nRust no es solo un lenguaje de moda. Su sistema de propiedad (ownership) y borrow checker garantizan que no obtendrás un null pointer o referencias colgantes. Y PostgreSQL no es solo una base de datos. Es una herramienta potente con soporte para JSON, búsqueda de texto completo y transacciones complejas.
Cuando combinas Rust y PostgreSQL, obtienes:
\n- \n
- Seguridad — Rust no te permitirá enviar SQL incorrecto accidentalmente. \n
- Rendimiento — los controladores asíncronos funcionan a nivel de C. \n
- Control — tú decides cuándo y cómo obtener los datos. \n
Instalación y configuración del entorno
\n\nAntes de escribir código, asegúrate de tener instalado:
\n- \n
- Rust (última versión estable) —
rustup update\n - PostgreSQL (localmente o mediante Docker) —
docker run --name pg -e POSTGRES_PASSWORD=pass -p 5432:5432 -d postgres\n - La biblioteca
libpq-dev(para Linux) o su equivalente en Mac/Windows \n
Crea un nuevo proyecto:
\n\ncargo new rust-postgres-guide\ncd rust-postgres-guide\n\nElección del controlador: tokio-postgres vs sqlx
\n\nHay dos enfoques principales para trabajar con PostgreSQL en Rust:
\n- \n
- tokio-postgres — controlador asíncrono de bajo nivel. Te da control total. \n
- sqlx — controlador asíncrono de alto nivel con verificación de consultas en tiempo de compilación. \n
Para proyectos avanzados, recomiendo sqlx: es más conveniente y seguro. Pero para máximo control, usa tokio-postgres.
\n\nAgreguemos las dependencias en Cargo.toml:
[dependencies]\ntokio = { version = "1", features = ["full"] }\nsqlx = { version = "0.7", features = ["runtime-tokio-rustls", "postgres"] }\nserde = { version = "1", features = ["derive"] }\n\n\nPrimera conexión: Rust y PostgreSQL se encuentran
\n\nEscribamos un ejemplo simple que se conecta a la base de datos y devuelve la versión de PostgreSQL.
\n\nuse sqlx::postgres::PgPoolOptions;\nuse std::error::Error;\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn Error>> {\n // Cadena de conexión: postgres://usuario:contraseña@host:puerto/bd\n let database_url = "postgres://postgres:pass@localhost:5432/postgres";\n \n // Creamos un pool de conexiones (reutilizables)\n let pool = PgPoolOptions::new()\n .max_connections(5)\n .connect(database_url)\n .await?;\n\n // Ejecutamos la consulta\n let row: (String,) = sqlx::query_as("SELECT version()")\n .fetch_one(&pool)\n .await?;\n\n println!("Versión de PostgreSQL: {}", row.0);\n Ok(())\n}\n\nEjecuta el código: cargo run. Si todo está configurado correctamente, verás la versión de PostgreSQL. Observa PgPoolOptions: el pool de conexiones es obligatorio en producción. Reutiliza las conexiones y no las crea desde cero para cada consulta.
Creación de tablas y operaciones CRUD
\n\nAhora creemos una tabla users y realicemos operaciones básicas: inserción, lectura, actualización y eliminación.
Migración: creando la tabla
\n\nEn sqlx, las migraciones son archivos SQL separados. Crea una carpeta migrations y un archivo
Blogs
Book Recommendations
Leer también
Domain-Driven Design en Go: Cómo no ahogarse en capas de abstracción
PHP en proyectos reales: casos de grandes empresas y lecciones
Pruebas de integración de TypeScript con Docker: guía completa
Trabajo con colas de tareas en Kotlin: guía completa para principiantes
Optimización del rendimiento de aplicaciones C++ para principiantes