O que é SQLx e para que serve?
\n\nSQLx é uma biblioteca Rust assíncrona e pura para trabalhar com bancos de dados, que implementa a abordagem "SQL sem ORM". Ao contrário de soluções ORM como Diesel ou SeaORM, o SQLx não esconde consultas SQL por trás de abstrações, mas permite escrever código SQL puro, garantindo total segurança de tipos em tempo de compilação.
\n\nPrincipais vantagens do SQLx:
\n- \n
- Segurança de tipos em tempo de compilação — o SQLx verifica suas consultas SQL em relação ao esquema do banco de dados diretamente durante a compilação do projeto. \n
- Assincronicidade nativa — a biblioteca suporta totalmente async/await, sendo ideal para aplicações web de alta carga. \n
- Suporte a múltiplos SGBDs — PostgreSQL, MySQL, SQLite e MSSQL. \n
- Sem mágica — você escreve SQL comum, e a biblioteca apenas ajuda a passar parâmetros e obter resultados com segurança. \n
- Migrações — sistema integrado de gerenciamento de migrações de esquema de banco de dados. \n
O SQLx é ideal para projetos onde o controle total sobre as consultas, desempenho e segurança de tipos são importantes, mas sem a necessidade de aprender DSLs (linguagens específicas de domínio) complexas de ORM.
\n\nInstalação
\n\nO SQLx é instalado através do gerenciador de pacotes Cargo. Adicione a dependência no arquivo Cargo.toml:
[dependencies]\nsqlx = { version = "0.7", features = ["runtime-tokio-rustls", "postgres"] }\ntokio = { version = "1", features = ["full"] }\nanyhow = "1.0"\n\nDependendo do banco de dados utilizado, escolha a flag de recurso correspondente:
\n- \n
postgres— para PostgreSQL \n mysql— para MySQL \n sqlite— para SQLite \n mssql— para Microsoft SQL Server \n
Para o runtime, você pode escolher runtime-tokio-rustls (recomendado) ou runtime-async-std-rustls.
Início rápido
\n\nVamos criar uma aplicação simples que se conecta ao PostgreSQL e executa uma consulta:
\n\nuse sqlx::postgres::PgPoolOptions;\nuse anyhow::Result;\n\n#[tokio::main]\nasync fn main() -> Result<()> {\n // Cria um pool de conexões\n let pool = PgPoolOptions::new()\n .max_connections(5)\n .connect("postgres://user:password@localhost/mydb")\n .await?;\n\n // Executa uma consulta simples\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\nEste código cria um pool de 5 conexões com o banco de dados, executa uma consulta com parâmetro e exibe o resultado.
\n\nPrincipais métodos e funções do SQLx
\n\n1. sqlx::query
\nO que faz: Cria uma nova consulta SQL com possibilidade de vinculação de parâmetros. É o bloco de construção básico para todas as operações.
\nParâmetros:
\n- \n
sql: &str— string da consulta SQL com placeholders ($1, $2 para PostgreSQL; ? para MySQL/SQLite) \n
Exemplo:
\nuse sqlx::query;\n\nlet query = sqlx::query("SELECT * FROM users WHERE id = $1 AND active = $2")\n .bind(1)\n .bind(true);\n\n2. .bind()
\nO que faz: Vincula um valor ao parâmetro da consulta. A ordem das chamadas corresponde à ordem dos placeholders no SQL.
\nParâmetros:
\n- \n
value: impl Encode + Type<DB>— qualquer valor que possa ser codificado para o banco de dados (i32, String, bool, Option, etc.) \n
Exemplo:
\nlet 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