3 puntos por vtrapplepie 3 시간 전 | Aún no hay comentarios. | Compartir por WhatsApp

Si alguna vez has construido un backend serio con Rust, seguramente te topaste con esta pared al menos una vez. En el momento en que necesitas una base de datos, aparecen cuatro bibliotecas, cada una con su propia filosofía, sus trade-offs y su ejército de seguidores en Reddit, mirándote fijamente.

A mí también me pasó. Durante el último año desplegué en producción Diesel, SQLx, SeaORM y Rusqlite. En algunos casos la elección fue acertada; en otros, si volviera a hacerlo, escogería algo distinto. Y varias cosas fueron realmente inesperadas.

Aquí no hay discurso de marketing ni evasivas del tipo "depende del caso". Te voy a contar una opinión honesta de alguien que usó las cuatro en código real de operación.


En 2026, ¿por qué trabajar con BD en Rust?

Primero, saquemos esto del camino. ¿Por qué no usar SQLAlchemy en Python o Prisma en Node?

Hay tres cosas que hacen que uno termine eligiendo Rust para aplicaciones centradas en base de datos.

La seguridad en tiempo de compilación está en otro nivel. Algunas de estas bibliotecas literalmente validan las consultas SQL contra el esquema de la BD durante la compilación. ¿Te equivocaste al escribir el nombre de una columna? El compilador lo detecta. ¿El tipo no coincide en una cláusula WHERE? Se filtra antes de ejecutar el código. No exagero al decir cuánto me ha reducido las sesiones de depuración a las 3 de la mañana.

La asincronía por fin maduró. Hace unos años, el acceso asíncrono a bases de datos en Rust era tosco. Había que pelear con el borrow checker, malabarear lifetimes y lidiar con bibliotecas poco pulidas. ¿Ahora, en 2026? Simplemente funciona. Tokio es sólido y las bibliotecas ya encontraron su camino.

No tienes que preocuparte por el rendimiento. La sobrecarga del ORM no se come el presupuesto de cada request. El recolector de basura no se detiene a mitad de una transacción. La consulta se ejecuta, los resultados vuelven y la memoria se libera de forma determinista. Funciona tan bien que hasta resulta aburrido.


Los cuatro contendientes

Veámoslos junto con sus versiones más recientes a febrero de 2026.

  • Diesel (v2.3.6, enero de 2026) — ORM completo con SQL en tiempo de compilación
  • SQLx (v0.8.6, estable actual) — toolkit SQL asíncrono (no es ORM)
  • SeaORM (v2.0, enero de 2026) — ORM dinámico orientado primero a async
  • Rusqlite (v0.38.0, diciembre de 2025) — wrapper ligero de SQLite

Estas son herramientas fundamentalmente distintas que resuelven problemas relacionados. Vamos una por una.


Diesel: el que encuentra bugs antes que tú

Dónde encaja mejor: equipos con esquemas estables que quieren maximizar la seguridad en compilación

Diesel existe desde 2015. En el mundo Rust, eso ya roza lo antiguo. Y su madurez se nota, en el mejor sentido posible.

La idea central es esta: si el código de Diesel compila, el SQL es válido. No es una frase de marketing; literalmente así funciona. Diesel genera tipos Rust a partir del esquema de la BD y el compilador valida cada consulta que escribes contra esos tipos.

Por qué Diesel me sigue convenciendo

La validación en compilación es adictiva. Una vez que vives la experiencia de que "el compilador detectó un JOIN incorrecto antes incluso de correr tests", volver a SQL basado en strings se siente temerario. El mes pasado refactoricé un esquema —renombré tres columnas y cambié tipos— y Diesel me mostró, en tiempo de compilación, todas y cada una de las consultas que necesitaban cambios. Todas. Sin excepción.

Las zero-cost abstractions no son solo un eslogan. El SQL que genera Diesel es, en esencia, igual al que escribirías a mano. Comparé los planes de ejecución y eran idénticos. Obtienes la seguridad de un ORM con el rendimiento de SQL raw.

Las migraciones funcionan como deben. Suena a una vara baja, pero después de pelear con herramientas de migración en otros ecosistemas, el sistema de migraciones de Diesel se siente refrescantemente sólido. Crear, ejecutar, revertir: simplemente funciona.

Desventajas honestas

La asincronía es algo agregado, no nativo. Diesel en sí es síncrono. Si quieres async, necesitas diesel-async, que funciona bien, pero agrega una dependencia más y una carga mental extra. Si vienes del async nativo de SQLx o SeaORM, se nota.

La curva de aprendizaje es empinada. El sistema de tipos de Diesel es potente, y lo potente suele ser complejo. Cuando te equivocas con una consulta, el error del compilador es técnicamente correcto, pero puede venir en forma de un vómito de tipos genéricos de 40 líneas. Aprendes a leerlo, pero la primera semana cuesta.

Las consultas dinámicas son dolorosas. Si necesitas construir consultas cuya estructura cambia en runtime —como un endpoint de búsqueda con filtros opcionales— Diesel se resiste. Quiere formas de consulta estáticas. Cuando la consulta es dinámica, terminas pasando más tiempo peleando con el sistema de tipos que con la lógica de negocio.

Cuándo elegir Diesel

  • Tu proyecto usa PostgreSQL o MySQL y el esquema no cambia cada semana
  • La seguridad en tiempo de compilación no es negociable
  • Es código que vivirá años en producción y la exactitud importa
  • Si no tienes otra razón fuerte, es la opción por defecto

SQLx: escribe SQL y llévate la seguridad de regalo

Dónde encaja mejor: desarrolladores SQL-first que quieren validación en compilación sin aprender un DSL

Seamos claros. SQLx no es un ORM. No te genera consultas ni gestiona relaciones. Es un toolkit SQL. Pero mucha gente lo usa en el lugar donde usaría un ORM y, honestamente, para muchos proyectos es la mejor elección.

La magia funciona así. Escribes consultas SQL raw como strings. SQLx se conecta a una BD real durante la compilación y valida esa consulta. Si la tabla no existe, el nombre de la columna está mal o los tipos no coinciden: error de compilación. Obtienes seguridad al nivel de Diesel mientras escribes SQL normal.

Lo que SQLx hace realmente bien

Si sabes SQL, sabes SQLx. No hay un DSL de consultas que aprender. No hay un modelo mental nuevo. Escribes el SQL que ya conoces, le agregas un poco de macros y el compilador se encarga del resto. Por mi experiencia metiendo desarrolladores junior en proyectos con SQLx, les toma horas, no días.

Async desde el día uno. SQLx fue creado para Rust asíncrono. Ya sea con Tokio o async-std, eliges el runtime y listo. No hay crates aparte ni capas de compatibilidad. Así debería ser el acceso async a base de datos.

QueryBuilder maneja consultas dinámicas. Aquí es donde SQLx le gana silenciosamente a Diesel. ¿Necesitas un endpoint de búsqueda donde el usuario pueda filtrar por cualquier combinación de 12 campos? QueryBuilder de SQLx permite construir ese tipo de consultas dinámicas de forma intuitiva. Incluso armando la consulta por piezas, sigue siendo parametrizada y protegida contra inyección.

Desventajas honestas

La BD tiene que estar encendida durante la compilación. Este es el punto más debatido de SQLx. Tu pipeline de CI necesita acceso a la BD, y un desarrollador nuevo tiene que levantarla antes de compilar. El modo offline cachea los metadatos de las consultas, pero es un paso extra de workflow que hay que recordar.

No tiene funciones de ORM de alto nivel. No hay carga de relaciones. No hay eager loading ni lazy loading. No hay JOIN automáticos. Si tienes un modelo de datos complejo con relaciones anidadas, tendrás que escribir todo el SQL tú mismo. Para CRUD simple está bien. Para grafos de datos complejos, se vuelve tedioso.

El modo offline exige disciplina. Para compilar sin BD, generas archivos .sqlx con cargo sqlx prepare. Esos archivos contienen metadatos cacheados de las consultas. ¿Cambiaste una consulta y olvidaste regenerarlos? Build desactualizado. Funciona, pero hay fricción.

Cuándo elegir SQLx

  • Tu equipo ya piensa en SQL y no quiere una capa de abstracción
  • Las consultas dinámicas son un requisito central
  • Estás arrancando un proyecto nuevo y quieres el camino más corto hacia código de BD funcional
  • Necesitas acceso async a BD sin concesiones

SeaORM: el que se siente familiar

Dónde encaja mejor: desarrolladores que quieren una experiencia ORM moderna con async y consultas dinámicas

Si has usado Django ORM, ActiveRecord o Eloquent, SeaORM te resultará familiar. Y con la release 2.0 de enero de 2026, ya está realmente listo para producción.

SeaORM toma el enfoque opuesto al de Diesel. En vez de validación en tiempo de compilación, trabaja en runtime. Pierdes un poco de seguridad, pero ganas una flexibilidad con la que las otras bibliotecas no pueden competir.

Por qué SeaORM 2.0 llama la atención

Las relaciones funcionan como esperas. Uno a muchos, muchos a muchos, eager loading, lazy loading: SeaORM maneja todo eso. Si tienes un modelo de datos complejo como usuarios, posts, comentarios y tags, SeaORM te permite navegar esas relaciones de forma natural. No se siente como pelear con la BD.

Las consultas dinámicas son ciudadanas de primera clase. ¿Filtros opcionales? ¿Ordenamiento condicional? ¿Paginación? SeaORM maneja todo eso sin drama. Como el query builder trabaja en runtime, la estructura puede cambiar libremente. Ahí es donde Diesel sufre y SeaORM brilla.

Las funciones de la versión 2.0 son realmente útiles. Entity Loader resuelve elegantemente el problema N+1: en lugar de disparar consultas individuales por entidades relacionadas, las carga por lotes de forma eficiente. sea-orm-sync ofrece una variante síncrona para herramientas CLI y scripts. Nested ActiveModel hace que las inserciones complejas sean más limpias.

La generación de entidades sí ahorra tiempo real. Apuntas sea-orm-cli a la BD y genera las entidades Rust. ¿Cambió el esquema? Regeneras y listo. No es un trabajo glamoroso, pero automatizarlo reduce bugs derivados de definir structs a mano.

Desventajas honestas

Los errores en runtime existen. A diferencia de Diesel o SQLx, SeaORM no detecta incompatibilidades con el esquema en compilación. ¿Renombraste una columna y olvidaste actualizar la entidad? Error en runtime. Necesitas buena cobertura de tests para compensarlo.

Es relativamente nuevo. SeaORM 2.0 es estable, pero su ecosistema es más pequeño. Hay menos posts de blog, menos respuestas en Stack Overflow y menos hilos de "yo también tuve ese problema". Dependerás más de la documentación oficial y de Discord.

Tiene algo de sobrecarga en runtime. Construir consultas dinámicas cuesta algo. Es poco —para el 99% de las aplicaciones, insignificante—, pero si estás exprimiendo cada microsegundo, Diesel o SQLx serán más rápidos.

Cuándo elegir SeaORM

  • Estás construyendo una API web con relaciones complejas entre entidades
  • La búsqueda dinámica y el filtrado son funciones principales
  • Tu equipo viene de Django, Rails o Laravel y quiere patrones familiares
  • La velocidad de desarrollo importa más que las garantías en compilación

Rusqlite: la elección obvia (para SQLite)

Dónde encaja mejor: herramientas CLI, apps de escritorio, sistemas embebidos y cualquier cosa que use SQLite

Llamar a Rusqlite un "ORM" sería ser generoso. Es un wrapper sobre SQLite. Pero justamente ahí está su fortaleza: hace una sola cosa y la hace de forma impecable.

Si tu proyecto usa SQLite —y muchos proyectos en Rust lo hacen—, Rusqlite es una elección obvia, sin discusión.

Por qué Rusqlite simplemente funciona

SQLite embebido es una maravilla. Si activas el feature flag bundled, Rusqlite compila SQLite directamente dentro del binario. No hay dependencias del sistema. No hay que escuchar eso de "instala sqlite3-dev". El binario corre en cualquier lado. He desplegado herramientas CLI en máquinas peladas y simplemente funcionaron.

Es lo suficientemente delgado. Rusqlite no intenta hacerse el listo. Te da conexiones, prepared statements y transacciones, y encima añade la seguridad de tipos de Rust. El borrow checker evita mal uso de recursos. Los prepared statements evitan inyección. Eso es todo. Esa es toda la biblioteca.

Expone funciones específicas de SQLite. Funciones SQL personalizadas, tablas virtuales, full-text search, extensión JSON: Rusqlite te da acceso a todo el set de capacidades de SQLite. Los ORM genéricos suelen esconderlas detrás de abstracciones. Rusqlite te deja usarlas directamente.

Desventajas honestas

Solo sirve para SQLite. Si necesitas PostgreSQL o MySQL, Rusqlite no es tu biblioteca. Fin de la discusión.

No tiene comodidades de ORM. No hay query builder. No hay manejo de relaciones. No hay migraciones (aunque claro, puedes usar refinery o rusqlite_migration). Escribes strings SQL a mano y haces el mapeo de resultados manualmente.

Solo es síncrono. Rusqlite no hace async. Para herramientas CLI o apps de escritorio, normalmente no es problema. Para un servidor web, tendrás que usar el soporte SQLite de SQLx o envolverlo en un thread pool.

Cuándo elegir Rusqlite

  • Estás creando una herramienta CLI que necesita almacenamiento local
  • Es una aplicación de escritorio con BD embebida
  • Cualquier proyecto donde SQLite sea la elección correcta de BD
  • Vas a desplegar en entornos donde no puedes instalar un servidor de BD

Cómo decido yo en la práctica

Después de usar las cuatro en producción, este es el marco mental que tengo en la cabeza.

¿Es SQLite? → Rusqlite. Fin. No lo pienses demasiado.

¿Quieres validación SQL en compilación + un DSL de consultas? → Diesel. Es la apuesta más segura para codebases que van a vivir mucho tiempo.

¿Quieres validación en compilación pero prefieres SQL raw? → SQLx. Toda la seguridad sin curva de aprendizaje de un DSL.

¿Necesitas consultas dinámicas, relaciones y un ORM async moderno? → SeaORM 2.0. Especialmente si vienes de Django o Rails.

¿Elección por defecto para un proyecto nuevo? → Normalmente empiezo con Diesel. Salvo que tenga una razón clara para no hacerlo. La seguridad en tiempo de compilación me ha salvado demasiadas veces.


La verdad incómoda

Hay algo que nadie en la comunidad Rust quiere admitir: para la mayoría de los proyectos, cualquiera de estas opciones va a funcionar bien.

Todas están bien mantenidas. Todas previenen SQL injection. Todas funcionan con las bases de datos que te importan (dentro de su alcance respectivo). Las diferencias aparecen en los márgenes, y la mayoría de nosotros no vivimos en esos márgenes.

Elige la que encaje con la forma en que funciona tu cabeza. Si piensas en SQL, usa SQLx. Si quieres que el compilador te cuide, usa Diesel. Si quieres algo que se sienta como los ORM que ya conoces, usa SeaORM. Si es SQLite, usa Rusqlite.

Y deja de investigar tanto y empieza a hacer builds.

Aún no hay comentarios.

Aún no hay comentarios.