Migrações de banco de dados em TypeScript: como gerenciar o esquema sem dor
O desenvolvimento em TypeScript exige não apenas tipagem estrita do código, mas também um gerenciamento confiável da estrutura do banco de dados. Migrações são uma forma de versionar alterações no esquema do BD, permitindo que a equipe sincronize o estado do banco com o código da aplicação. Neste artigo, analisaremos as principais bibliotecas para migrações em projetos TypeScript, suas características e forneceremos exemplos práticos.
O que são migrações e por que são necessárias?
Uma migração é um arquivo com instruções que descrevem alterações no esquema do banco de dados (criação, modificação ou exclusão de tabelas, índices, relacionamentos). Vantagens de usar migrações:
- Versionamento — cada alteração é registrada em um arquivo separado com um carimbo de data/hora ou número.
- Reprodutibilidade — é possível implantar o banco do zero em qualquer versão.
- Trabalho em equipe — todos os desenvolvedores aplicam as mesmas alterações.
- Rollback — possibilidade de desfazer alterações malsucedidas.
Ferramentas populares para migrações em TypeScript
1. TypeORM
TypeORM é um ORM que funciona com TypeScript e JavaScript. O sistema de migrações integrado é baseado em linha de comando.
Instalação:
npm install typeorm reflect-metadatanpm install @types/node --save-devExemplo de geração de migração:
npx typeorm migration:create src/migration/AddUserTableExemplo de código de migração:
import { MigrationInterface, QueryRunner, Table } from "typeorm";
export class AddUserTable1234567890123 implements MigrationInterface { public async up(queryRunner: QueryRunner): Promise<void> { await queryRunner.createTable(new Table({ name: "users", columns: [ { name: "id", type: "int", isPrimary: true, isGenerated: true, generationStrategy: "increment" }, { name: "name", type: "varchar", length: "255" }, { name: "email", type: "varchar", length: "255", isUnique: true } ] })); }
public async down(queryRunner: QueryRunner): Promise<void> { await queryRunner.dropTable("users"); }}Execução de migrações:
npx typeorm migration:runVantagens: integração estreita com TypeORM, geração automática baseada em entidades.
Desvantagens: em projetos complexos pode ser lento, requer configuração.
2. Prisma
Prisma é um ORM moderno com um poderoso sistema de migrações. Usa uma DSL declarativa (Prisma Schema Language).
Instalação:
npm install prisma @prisma/clientnpx prisma initExemplo de esquema (schema.prisma):
model User { id Int @id @default(autoincrement()) name String email String @unique posts Post[]}
model Post { id Int @id @default(autoincrement()) title String content String? authorId Int author User @relation(fields: [authorId], references: [id])}Criação e aplicação de migração:
npx prisma migrate dev --name initPrisma cria automaticamente um arquivo SQL e o aplica ao banco de dados. Também é possível visualizar o status:
npx prisma migrate statusVantagens: abordagem declarativa, geração automática, excelente documentação.
Desvantagens: vinculado ao Prisma, difícil de contornar em cenários especiais.
3. Knex.js
Knex.js é um construtor de consultas leve para Node.js, que inclui um sistema de migrações. Funciona com TypeScript através de complementos
Também na biblioteca
Validação de dados em Node.js com Joi: guia completo
Cliente OAuth para TypeScript: integração de autorização em aplicações web
Criptografia em Node.js: criptografia e hash com crypto
ORM para C++: comparação e exemplos de uso (ODB, SOCI, SQLiteCpp)