Migrações de banco de dados em TypeScript: visão geral completa das ferramentas e guia prático
\n\nMigrações de banco de dados são uma forma de versionar e aplicar sequencialmente alterações no esquema do banco de dados (criação, modificação ou exclusão de tabelas, índices e restrições). No ecossistema TypeScript, existem várias ferramentas poderosas para gerenciar migrações. Neste artigo, analisaremos detalhadamente as três soluções mais populares: TypeORM, Prisma e Drizzle ORM.
\n\nPor que as migrações são necessárias?
\nSem migrações, os desenvolvedores frequentemente fazem alterações manualmente via console SQL ou painel de administração, o que leva a:
\n- \n
- Perda de sincronização entre o ambiente de desenvolvimento e produção; \n
- Erros devido a fator humano; \n
- Dificuldades ao reverter alterações. \n
As migrações resolvem esses problemas, permitindo aplicar e reverter alterações automaticamente, além de armazenar o histórico de todas as mudanças no esquema no código.
\n\n1. TypeORM — abordagem clássica com ActiveRecord e Data Mapper
\nTypeORM é um dos ORMs mais maduros para TypeScript e JavaScript. Ele suporta tanto o padrão ActiveRecord quanto o Data Mapper, e possui um sistema de migrações integrado.
\n\nInstalação e configuração
\nnpm install typeorm reflect-metadata @types/node\nnpm install pg # para PostgreSQL\n\nCrie um arquivo de configuração ormconfig.json ou use data-source.ts:
import { DataSource } from "typeorm";\n\nexport const AppDataSource = new DataSource({\n type: "postgres",\n host: "localhost",\n port: 5432,\n username: "user",\n password: "password",\n database: "mydb",\n entities: ["src/entity/*.ts"],\n migrations: ["src/migration/*.ts"],\n synchronize: false, // desativa a autossincronização\n});\n\nCriação e execução de migração
\nPrimeiro, vamos gerar uma migração com base nas alterações nas entidades:
\nnpx typeorm migration:generate src/migration/AddUserTable -d src/data-source.ts\n\nExemplo de migração gerada:
\nimport { MigrationInterface, QueryRunner, Table } from "typeorm";\n\nexport class AddUserTable1234567890 implements MigrationInterface {\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.createTable(\n new Table({\n name: "user",\n columns: [\n { name: "id", type: "int", isPrimary: true, isGenerated: true, generationStrategy: "increment" },\n { name: "name", type: "varchar", length: "255" },\n { name: "email", type: "varchar", isUnique: true },\n ],\n })\n );\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.dropTable("user");\n }\n}\n\nAplique a migração:
\nnpx typeorm migration:run -d src/data-source.ts\n\nPrós e contras do TypeORM
\n- \n
- Prós: grande ecossistema, suporte a vários bancos de dados (PostgreSQL, MySQL, SQLite, MSSQL), geração de migrações a partir de entidades. \n
- Contras: configuração complexa, desempenho lento com grande número de entidades, base de código desatualizada. \n
2. Prisma — ORM moderno com migrações automáticas
\nPrisma é o novo padrão em ORM para TypeScript. Ele usa um esquema declarativo (schema.prisma) e gera migrações automaticamente.
Instalação e inicialização
\nnpm install prisma @prisma/client\nnpx prisma init\n\nDefina o modelo em prisma/schema.prisma:
generator client {\n provider = "prisma-client-js"\n}\n\ndatasource db {\n provider = "postgresql"\n url = env("DATABASE_URL")\n}\n\nmodel User {\n id Também na biblioteca
EasyNetQ para C# (.NET): Guia completo com exemplos práticos
mockall para Rust: guia completo com exemplos práticos
Autorização e Autenticação em TypeScript: guia completo
ORM para Kotlin: comparação entre Exposed, Room e Ktorm com exemplos