Rust e PostgreSQL: a dupla que torna seu código mais rápido
\n\nVocê 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\nNeste 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\nPor que Rust e PostgreSQL?
\n\nRust 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.
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
Instalação e configuração do ambiente
\n\nAntes 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
Crie um novo projeto:
\n\ncargo new rust-postgres-guide\ncd rust-postgres-guide\n\nEscolha do driver: tokio-postgres vs sqlx
\n\nExistem 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
Para projetos avançados, recomendo sqlx — é mais conveniente e seguro. Mas para controle máximo, use tokio-postgres.
\n\nAdicione as dependências no Cargo.toml:
[dependencies]\ntokio = { version = "1", features = ["full"] }\nsqlx = { version = "0.7", features = ["runtime-tokio-rustls", "postgres"] }\nserde = { version = "1", features = ["derive"] }\n\n\nPrimeira conexão: Rust e PostgreSQL se encontram
\n\nVamos escrever um exemplo simples que conecta ao banco e retorna a versão do PostgreSQL.
\n\nuse 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\nExecute 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.
Criação de tabelas e operações CRUD
\n\nAgora vamos criar a tabela users e realizar operações básicas: inserção, leitura, atualização, exclusão.
Migração: criando a tabela
\n\nNo sqlx, migrações são arquivos SQL separados. Crie uma pasta migrations e um arquivo
Blogs
Book Recommendations
Leia também
Funções Serverless em Rust no AWS Lambda: guia completo
Swift encode URL: 5 erros fatais e como evitá-los
Gerenciamento de memória e garbage collector em PHP: guia completo
Depuração de código Rust: guia completo sobre técnicas e ferramentas
Code review em C#: o que verificar e como dar feedback para iniciantes