Gerar migrations a partir de um dump do PostgreSQL

TLDR: Ler um dump do PostgreSQL e gerar migrations do ActiveRecord organizadas, separadas em tabelas, índices e constraints.

Contexto

O banco de leads já existe e seu schema está descrito num dump do PostgreSQL. Em vez de uma única migration com tudo dentro, o objetivo é gerar migrations limpas e organizadas seguindo as convenções do ActiveRecord — uma migration por tabela, depois os índices, e por fim as constraints (chaves estrangeiras e checks).

Abordagem

As migrations são divididas nesta ordem:

  1. Tabelas — uma migration por tabela, com colunas nos tipos corretos, defaults e restrições de nulidade
  2. Índices — agrupados logicamente (uma migration por tabela, ou uma única global se o volume for pequeno)
  3. Constraints — chaves estrangeiras e check constraints numa migration final, que depende de todas as tabelas já existirem

Objetivos

  • Gerar uma migration por tabela (create_<table>)
  • Gerar uma migration de índices separada por domínio/grupo
  • Gerar uma migration de constraints (chaves estrangeiras e check constraints)
  • Seguir as convenções do ActiveRecord 8.0 (reversível, método change)
  • Usar o padrão de nomes de make leads.migration.create, com timestamps corretos

Fora de escopo

— (não registrado na spec original)

Mudanças

  • leads/db/migrate/TIMESTAMP_create_<table>.rb — um arquivo por tabela
  • leads/db/migrate/TIMESTAMP_add_indexes_to_<table>.rb — migrations de índice por tabela
  • leads/db/migrate/TIMESTAMP_add_constraints.rb — chaves estrangeiras e check constraints

Pré-requisitos

  • É preciso ter o arquivo de dump (.sql) — colocado em leads/db/ ou compartilhado diretamente
  • O dump deve ser saída em texto puro de pg_dump --schema-only (não o formato binário)

Como verificar

bash make leads.db.create make leads.db.migrate # o schema resultante deve bater com o dump original

Documentação

— (não registrado na spec original)