Rust e PostgreSQL: escrevendo consultas performáticas sem dor

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Rust e PostgreSQL: a dupla que torna seu código mais rápido

\n\n

Você já se perguntou por que cada vez mais desenvolvedores backend estão migrando para Rust? A resposta é simples: Rust oferece controle sobre memória e velocidade, e PostgreSQL sobre dados. Juntos, eles formam uma combinação capaz de suportar a carga de centenas de milhares de consultas por segundo sem "lentidão" ou vazamentos.

\n\n

Neste guia, vamos explorar como integrar Rust e PostgreSQL. Você aprenderá a configurar a conexão, executar consultas, evitar injeções de SQL e construir aplicações assíncronas. Vamos lá!

\n\n

Por que Rust e PostgreSQL?

\n\n

Rust não é apenas uma linguagem da moda. Seu sistema de ownership e borrow checker garantem que você não terá null pointer ou referências pendentes. E PostgreSQL não é apenas um BD. É uma ferramenta poderosa com suporte a JSON, busca em texto completo e transações complexas.

\n\n

Ao combinar Rust e PostgreSQL, você obtém:

\n
    \n
  • Segurança — Rust não permite que você envie SQL incorreto acidentalmente.
  • \n
  • Desempenho — drivers assíncronos operam no nível de C.
  • \n
  • Controle — você decide quando e como buscar dados.
  • \n
\n\n

Instalação e configuração do ambiente

\n\n

Antes de escrever código, certifique-se de ter instalado:

\n
    \n
  • Rust (última versão estável) — rustup update
  • \n
  • PostgreSQL (localmente ou via Docker) — docker run --name pg -e POSTGRES_PASSWORD=pass -p 5432:5432 -d postgres
  • \n
  • Biblioteca libpq-dev (para Linux) ou equivalente no Mac/Windows
  • \n
\n\n

Crie um novo projeto:

\n\n
cargo new rust-postgres-guide\ncd rust-postgres-guide
\n\n

Escolha do driver: tokio-postgres vs sqlx

\n\n

Existem duas abordagens principais para trabalhar com PostgreSQL em Rust:

\n
    \n
  • tokio-postgres — driver assíncrono de baixo nível. Oferece controle total.
  • \n
  • sqlx — driver assíncrono de alto nível com verificação de consultas em tempo de compilação.
  • \n
\n\n

Para projetos avançados, recomendo sqlx — é mais conveniente e seguro. Mas para controle máximo, use tokio-postgres.

\n\n

Adicione as dependências no Cargo.toml:

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

Primeira conexão: Rust e PostgreSQL se encontram

\n\n

Vamos escrever um exemplo simples que conecta ao banco e retorna a versão do PostgreSQL.

\n\n
use sqlx::postgres::PgPoolOptions;\nuse std::error::Error;\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn Error>> {\n    // String de conexão: postgres://user:password@host:port/db\n    let database_url = "postgres://postgres:pass@localhost:5432/postgres";\n    \n    // Criamos um pool de conexões (reusable connections)\n    let pool = PgPoolOptions::new()\n        .max_connections(5)\n        .connect(database_url)\n        .await?;\n\n    // Executamos a consulta\n    let row: (String,) = sqlx::query_as("SELECT version()")\n        .fetch_one(&pool)\n        .await?;\n\n    println!("PostgreSQL version: {}", row.0);\n    Ok(())\n}
\n\n

Execute o código: cargo run. Se tudo estiver configurado corretamente, você verá a versão do PostgreSQL. Observe o PgPoolOptions — o pool de conexões é obrigatório em produção. Ele reutiliza conexões e não as cria novamente para cada consulta.

\n\n

Criação de tabelas e operações CRUD

\n\n

Agora vamos criar a tabela users e realizar operações básicas: inserção, leitura, atualização, exclusão.

\n\n

Migração: criando a tabela

\n\n

No sqlx, migrações são arquivos SQL separados. Crie uma pasta migrations e um arquivo

Blogs

Book Recommendations