Migrações de banco de dados em TypeScript: TypeORM, Prisma e Drizzle

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 TypeScript: visão geral completa das ferramentas e guia prático

\n\n

Migraçõ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\n

Por que as migrações são necessárias?

\n

Sem 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
\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\n

1. TypeORM — abordagem clássica com ActiveRecord e Data Mapper

\n

TypeORM é 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\n

Instalação e configuração

\n
npm install typeorm reflect-metadata @types/node\nnpm install pg  # para PostgreSQL
\n\n

Crie um arquivo de configuração ormconfig.json ou use data-source.ts:

\n
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\n

Criação e execução de migração

\n

Primeiro, vamos gerar uma migração com base nas alterações nas entidades:

\n
npx typeorm migration:generate src/migration/AddUserTable -d src/data-source.ts
\n\n

Exemplo de migração gerada:

\n
import { 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\n

Aplique a migração:

\n
npx typeorm migration:run -d src/data-source.ts
\n\n

Pró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
\n\n

2. Prisma — ORM moderno com migrações automáticas

\n

Prisma é o novo padrão em ORM para TypeScript. Ele usa um esquema declarativo (schema.prisma) e gera migrações automaticamente.

\n\n

Instalação e inicialização

\n
npm install prisma @prisma/client\nnpx prisma init
\n\n

Defina o modelo em prisma/schema.prisma:

\n
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                    

Recommendations