SQLx para Rust: guía completa con ejemplos

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

¿Qué es SQLx y para qué sirve?

\n\n

SQLx es una biblioteca asíncrona y pura de Rust para trabajar con bases de datos, que implementa el enfoque "SQL sin ORM". A diferencia de soluciones ORM como Diesel o SeaORM, SQLx no oculta las consultas SQL detrás de abstracciones, sino que permite escribir código SQL puro, garantizando al mismo tiempo la seguridad total de tipos en tiempo de compilación.

\n\n

Principales ventajas de SQLx:

\n
    \n
  • Seguridad de tipos en tiempo de compilación — SQLx verifica sus consultas SQL contra el esquema de la base de datos directamente durante la compilación del proyecto.
  • \n
  • Asincronía integrada — la biblioteca es totalmente compatible con async/await, ideal para aplicaciones web de alta carga.
  • \n
  • Soporte para múltiples SGBD — PostgreSQL, MySQL, SQLite y MSSQL.
  • \n
  • Sin magia — usted escribe SQL normal y la biblioteca solo ayuda a pasar parámetros de forma segura y obtener resultados.
  • \n
  • Migraciones — sistema integrado de gestión de migraciones del esquema de la base de datos.
  • \n
\n\n

SQLx es ideal para proyectos donde se requiere control total sobre las consultas, rendimiento y seguridad de tipos, sin necesidad de aprender DSL complejos (lenguajes específicos de dominio) de ORM.

\n\n

Instalación

\n\n

SQLx se instala a través del gestor de paquetes Cargo. Agregue la dependencia en el archivo Cargo.toml:

\n\n
[dependencies]\nsqlx = { version = "0.7", features = ["runtime-tokio-rustls", "postgres"] }\ntokio = { version = "1", features = ["full"] }\nanyhow = "1.0"
\n\n

Dependiendo de la base de datos utilizada, seleccione el flag de característica correspondiente:

\n
    \n
  • postgres — para PostgreSQL
  • \n
  • mysql — para MySQL
  • \n
  • sqlite — para SQLite
  • \n
  • mssql — para Microsoft SQL Server
  • \n
\n\n

Para el runtime puede elegir runtime-tokio-rustls (recomendado) o runtime-async-std-rustls.

\n\n

Inicio rápido

\n\n

Creemos una aplicación simple que se conecte a PostgreSQL y ejecute una consulta:

\n\n
use sqlx::postgres::PgPoolOptions;\nuse anyhow::Result;\n\n#[tokio::main]\nasync fn main() -> Result<()> {\n    // Creamos un pool de conexiones\n    let pool = PgPoolOptions::new()\n        .max_connections(5)\n        .connect("postgres://user:password@localhost/mydb")\n        .await?;\n\n    // Ejecutamos una consulta simple\n    let row: (i64,) = sqlx::query_as("SELECT $1::bigint")\n        .bind(42_i64)\n        .fetch_one(&pool)\n        .await?;\n\n    println!("Resultado: {}", row.0);\n\n    Ok(())\n}
\n\n

Este código crea un pool de 5 conexiones a la base de datos, ejecuta una consulta con un parámetro y muestra el resultado.

\n\n

Métodos y funciones principales de SQLx

\n\n

1. sqlx::query

\n

Qué hace: Crea una nueva consulta SQL con capacidad de enlazar parámetros. Es el bloque de construcción básico para todas las operaciones.

\n

Parámetros:

\n
    \n
  • sql: &str — cadena de consulta SQL con marcadores de posición ($1, $2 para PostgreSQL; ? para MySQL/SQLite)
  • \n
\n

Ejemplo:

\n
use sqlx::query;\n\nlet query = sqlx::query("SELECT * FROM users WHERE id = $1 AND active = $2")\n    .bind(1)\n    .bind(true);
\n\n

2. .bind()

\n

Qué hace: Enlaza un valor al parámetro de la consulta. El orden de las llamadas corresponde al orden de los marcadores de posición en SQL.

\n

Parámetros:

\n
    \n
  • value: impl Encode + Type<DB> — cualquier valor que pueda codificarse para la BD (i32, String, bool, Option, etc.)
  • \n
\n

Ejemplo:

\n
let user_id: i32 = 42;\nlet user_name: &str = "Alice";\n\nsqlx::query("INSERT INTO users (id, name) VALUES ($1, $2)")\n    .bind(user_id)\n    .bind(user_name)\n    .execute(&p                    

Recommendations