Cómo SQLx cambia el trabajo con bases de datos en Rust
Imagina esto: escribiste una consulta SQL compleja, compilaste tu proyecto en Rust, lo ejecutaste y... obtuviste un Error de Runtime porque escribiste mal un nombre de columna o te olvidaste de pasar un argumento. ¿Molesto, verdad? Especialmente en un lenguaje que se enorgullece de su seguridad. Eso es exactamente el problema que SQLx resuelve.
Qué es en realidad
SQLx no es un ORM típico como Hibernate o SQLAlchemy. Los desarrolladores lo llaman un "toolkit SQL". La característica principal del proyecto es que valida tus consultas SQL en tiempo de compilación. Si cometiste un error tipográfico en SELECT o intentas meter una cadena donde la base de datos espera un número, el compilador de Rust simplemente no te dejará compilar el binario.
El proyecto es completamente asíncrono y está escrito en Rust puro (excepto el driver de SQLite, que importa una biblioteca en C). Soporta PostgreSQL, MySQL y SQLite. Antes había soporte para MSSQL, pero fue eliminado en la versión 0.7, con la promesa de reescribir el driver desde cero.
Validación de consultas en tiempo de compilación
Esta es probablemente la mayor fortaleza de la biblioteca. En lugar de construir consultas a través de cadenas de métodos (DSL), como hacen Diesel o SeaORM, escribes SQL puro dentro de una macro.
¿Cómo funciona? Durante la compilación, SQLx se conecta a tu base de datos (la ruta se especifica en la variable de entorno DATABASE_URL), le pide que valide la consulta y devuelve información de tipos. Si la base de datos dice que la consulta es correcta, la macro genera una estructura anónima con los resultados.
Por cierto, si no quieres que tu servidor de CI acceda a la base de datos real cada vez durante la compilación, SQLx tiene un "modo offline". Preparas la caché con los metadatos de las consultas una vez, y luego el proyecto se compila sin conexión a la red.
Asincronía y rendimiento
SQLx fue diseñado desde cero para async/await. No intenta imitar una API síncrona envuelta en hilos. La biblioteca puede transmitir datos: si necesitas exportar un millón de filas, puedes procesarlas una por una según llegan del socket, sin llenar toda la memoria de una vez.
Curiosamente, el proyecto no está atado a un runtime específico. Puedes usar tokio, async-std, o actix — solo habilita el flag de feature necesario en Cargo.toml.
SQLx fue diseñado desde cero para async/await. No intenta imitar una API síncrona envuelta en hilos. La biblioteca puede transmitir datos: si necesitas exportar un millón de filas, puedes procesarlas una por una según llegan del socket, sin llenar toda la memoria de una vez.
Curiosamente, el proyecto no está atado a un runtime específico. Puedes usar tokio, async-std, o actix — solo habilita el flag de feature necesario en Cargo.toml.
Por qué no es un ORM
SQLx no tiene conceptos familiares como "modelos" o "relaciones". No describes User has_many Posts en código Rust. Describes JOIN en la consulta SQL.
Para quienes están acostumbrados a tener control total sobre la base de datos, esto es una gran ventaja. Usas todo el poder de tu DBMS específico: tipos de datos específicos (como JSONB en Postgres), funciones de ventana o triggers complejos. SQLx solo se encarga del trabajo tedioso de mapear resultados a estructuras Rust mediante la macro derive FromRow.
Detalles pequeños pero útiles
La biblioteca tiene muchas cosas útiles que normalmente tienes que buscar en plugins de terceros:
- Pool de conexiones integrado. No necesitas conectar
r2d2o algo similar. - Soporte para migraciones. Hay una utilidad CLI y la macro
migrate!que embebe las migraciones directamente en tu binario. - Soporte para
LISTEN/NOTIFYpara PostgreSQL de serie. - Manejo de transacciones, incluyendo transacciones anidadas mediante savepoints.
¿Vale la pena usarlo
SQLx es perfecto si amas SQL y quieres usar las capacidades de tu base de datos al máximo, sin perder la seguridad de tipos de Rust.
Sin embargo, pagas la validación de consultas en tiempo de compilación con tiempo de compilación. Si tienes cientos de macros query!, cargo check puede volverse notablemente más lento. En tales casos, los desarrolladores recomiendan ajustar el nivel de optimización para macros en el perfil de desarrollo:
Si necesitas un ORM clásico con generación automática de consultas, mejor mira SeaORM, que por cierto está construido sobre SQLx.
En general, el proyecto se ve muy maduro. Tiene más de 17,000 estrellas en GitHub y una comunidad activa. Si estás comenzando un nuevo backend en Rust y no tienes miedo de escribir SQL a mano — probablemente es la mejor opción hoy.
Proyectos relacionados