Migrações de banco de dados em Rust: visão geral das ferramentas Diesel, SeaORM e sqlx

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

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_users


Vantagens 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(), )

Recommendations