Migrações de banco de dados em Rust: visão geral das ferramentas Diesel, SeaORM e sqlx
Gerenciar alterações no esquema do banco de dados é uma das tarefas principais no desenvolvimento de qualquer aplicação web. No ecossistema Rust, existem várias ferramentas maduras para esse fim. Neste artigo, examinaremos três abordagens principais para migrações: Diesel, SeaORM e sqlx. Cada uma oferece sua própria abordagem única para o gerenciamento de versões do esquema de BD, e a escolha da ferramenta correta pode impactar significativamente a arquitetura do projeto.
1. Diesel — ORM clássico com integração de migrações
Diesel é um ORM e Query Builder seguro e extensível para Rust, que é fortemente integrado ao sistema de migrações. Sua principal vantagem é a verificação de tipos em tempo de compilação: as estruturas das tabelas são geradas com base no esquema do BD, eliminando erros de incompatibilidade de tipos.
As migrações no Diesel são arquivos SQL comuns, organizados no diretório migrations/. Cada migração contém dois arquivos: up.sql (aplicar alterações) e down.sql (reverter).
Exemplo de estrutura de migração para criar uma tabela de usuários:
-- migrations/2024-01-15-120000_create_users/up.sqlCREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(255) NOT NULL UNIQUE, email VARCHAR(255) NOT NULL UNIQUE, created_at TIMESTAMP NOT NULL DEFAULT NOW());
-- migrations/2024-01-15-120000_create_users/down.sqlDROP TABLE IF EXISTS users;Para executar as migrações, usa-se a ferramenta CLI diesel_cli:
# Instalaçãocargo install diesel_cli --no-default-features --features postgres
# Executar migraçõesdiesel migration run
# Reverter a última migraçãodiesel migration revert
# Gerar nova migraçãodiesel migration generate create_usersVantagens do Diesel:
- Verificação completa de tipos em tempo de compilação
- Estrutura de migrações simples e clara (SQL puro)
- Suporte nativo a reversões
- Excelente desempenho
Desvantagens:
- Requer instalação de uma ferramenta CLI adicional
- Configuração complexa para projetos com múltiplos bancos de dados
- Menos flexibilidade em comparação com sqlx
2. SeaORM — ORM assíncrono com sistema de migrações flexível
SeaORM (baseado em sea-query e sqlx) é um ORM assíncrono que oferece uma abordagem mais moderna para migrações. Ao contrário do Diesel, as migrações no SeaORM são escritas em Rust, e não em SQL, permitindo usar todo o poder da linguagem para descrever alterações no esquema.
Exemplo de migração usando SeaORM:
use sea_orm_migration::prelude::*;
#[derive(DeriveMigrationName)]pub struct Migration;
#[async_trait::async_trait]impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { manager .create_table( Table::create() .table(Users::Table) .if_not_exists() .col( ColumnDef::new(Users::Id) .integer() .not_null() .auto_increment() .primary_key(), ) .col(ColumnDef::new(Users::Username).string().not_null()) .col(ColumnDef::new(Users::Email).string().not_null()) .col( ColumnDef::new(Users::CreatedAt) .timestamp() .default(Expr::current_timestamp()), ) .to_owned(), )