>_ DevTrendspt

Idioma

Início

Linguagens

Seções

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embarcados Segurança
Rust

Como o SQLx Muda o Trabalho com Bancos de Dados em Rust

Imagine o seguinte: você escreveu uma query SQL complexa, compilou seu projeto Rust, executou e... recebeu um Erro de Runtime porque digitou errado um nome de coluna ou esqueceu de passar um argumento. Irritante, não? Especialmente em uma linguagem que se orgulha de sua segurança. É exatamente esse problema que o SQLx resolve.

O que é isso afinal

SQLx não é um ORM típico como Hibernate ou SQLAlchemy. Os desenvolvedores o chamam de "toolkit SQL". A principal funcionalidade do projeto é que ele valida suas queries SQL em tempo de compilação. Se você cometer um erro de digitação em SELECT ou tentar inserir uma string onde o banco de dados espera um número, o compilador Rust simplesmente não deixará você compilar o binário.

O projeto é totalmente assíncrono e escrito em Rust puro (exceto pelo driver do SQLite, que utiliza uma biblioteca C). Suporta PostgreSQL, MySQL e SQLite. Já houve suporte para MSSQL, mas foi removido na versão 0.7, com a promessa de reescrever o driver do zero.

Validação de queries em tempo de compilação

Essa é provavelmente a maior força da biblioteca. Em vez de construir queries através de cadeias de métodos (DSL), como Diesel ou SeaORM fazem, você escreve SQL puro dentro de uma macro.

Como funciona? Durante o build, o SQLx conecta ao seu banco de dados (o caminho é especificado na variável de ambiente DATABASE_URL), pede para ele validar a query e retorna informações de tipos. Se o banco de dados disser que a query está correta, a macro gera uma struct anônima com os resultados.

Aliás, se você não quer que seu servidor de CI acesse o banco de dados real toda vez durante o build, o SQLx tem um "modo offline". Você prepara o cache com metadados da query uma vez, e então o projeto é compilado sem conexão de rede.

Assincronia e performance

O SQLx foi projetado desde o início para async/await. Ele não tenta imitar uma API síncrona envolta em threads. A biblioteca pode fazer streaming de dados: se você precisa exportar um milhão de linhas, pode processá-las uma por uma conforme chegam do socket, sem preencher toda a memória de uma vez.

Curiosamente, o projeto não está atrelado a um runtime específico. Você pode usar tokio, async-std ou actix — basta habilitar a feature flag necessária em Cargo.toml.

O SQLx foi projetado desde o início para async/await. Ele não tenta imitar uma API síncrona envolta em threads. A biblioteca pode fazer streaming de dados: se você precisa exportar um milhão de linhas, pode processá-las uma por uma conforme chegam do socket, sem preencher toda a memória de uma vez.

Curiosamente, o projeto não está atrelado a um runtime específico. Você pode usar tokio, async-std ou actix — basta habilitar a feature flag necessária em Cargo.toml.

Por que não é um ORM

O SQLx não possui conceitos familiares como "models" ou "relationships". Você não descreve User has_many Posts em código Rust. Você descreve JOIN na query SQL.

Para quem está acostumado a ter controle total sobre o banco de dados, isso é uma grande vantagem. Você usa todo o poder do seu DBMS específico: tipos de dados específicos (como JSONB no Postgres), window functions ou triggers complexas. O SQLx cuida apenas do trabalho tedioso de mapear resultados para structs Rust através da derive macro FromRow.

Pequenos detalhes úteis

A biblioteca tem muitas funcionalidades interessantes que geralmente você teria que procurar em plugins de terceiros:

  • Connection pool integrada. Não precisa plugar r2d2 ou similar.
  • Suporte a migrations. Existe um utilitário CLI e a macro migrate! que embeda migrations diretamente no seu binário.
  • Suporte para LISTEN/NOTIFY no PostgreSQL pronto para uso.
  • Tratamento de transações, incluindo transações aninhadas via savepoints.

Vale a pena usar

O SQLx é perfeito se você ama SQL e quer usar as capacidades do seu banco de dados ao máximo, sem perder a segurança de tipos do Rust.

Porém, você paga pela validação de queries em tempo de compilação com tempo de build. Se você tiver centenas de macros query!, o cargo check pode ficar perceptivelmente mais lento. Nesses casos, os desenvolvedores recomendam ajustar o nível de otimização para macros no perfil de desenvolvimento:

Se você precisa de um ORM clássico com geração automática de queries, é melhor olhar o SeaORM, que aliás é construído em cima do SQLx.

No geral, o projeto parece muito maduro. Tem mais de 17.000 estrelas no GitHub e uma comunidade ativa. Se você está começando um novo backend em Rust e não tem medo de escrever SQL manualmente — provavelmente é a melhor escolha hoje.

Projetos relacionados