Um arquivo de schema por schema do PostgreSQL
TLDR: Trocar o
schema.rbúnico por um arquivo por schema do PostgreSQL emdb/schemas/, dando visibilidade completa depublic,latameperformance.
Contexto
O db/schema.rb padrão só captura o schema public. Tabelas em latam e performance ficam invisíveis no arquivo gerado, o que traz três problemas:
db:schema:loadrecriaria apenas as tabelas depublic- não há representação como código dos schemas não-públicos
- chaves primárias compostas e check constraints se perdem (limitação do formato
:ruby)
Tradeoffs avaliados
| Esta abordagem | structure.sql |
|
|---|---|---|
| Legibilidade | ✅ DSL Ruby por schema | ❌ dump de SQL cru |
| Completude | ✅ todos os schemas | ✅ todos os schemas |
| PKs compostas | ⚠️ parcial (limitação do dumper do AR) | ✅ fidelidade total |
| Ferramental padrão | ❌ exige tasks customizadas | ✅ funciona de fábrica |
| FKs entre schemas | ⚠️ não capturadas | ✅ capturadas |
Objetivos
- Um arquivo de schema por schema do PostgreSQL (
public.rb,latam.rb,performance.rb) - Cada arquivo reflete apenas o próprio schema — legível e focado
- Tasks Rake customizadas
db:schemas:dumpedb:schemas:loadsubstituem as embutidas
Fora de escopo
Limitações aceitas conscientemente:
- O
SchemaDumperdo AR continua sem capturar PKs compostas (igual aoschema.rb) - Os nomes de tabela aparecem sem o prefixo do schema em cada arquivo (ex.:
create_table "cadastro_gtm"dentro delatam.rb) — é o isolamento por arquivo, e é intencional db:schema:load(o padrão dostandalone_migrations) continua usando sópublic.rb; a carga completa exigedb:schemas:load
Mudanças
Arquivos novos
automation/db/schemas/public.rb— gerado comsearch_path = publicautomation/db/schemas/latam.rb— gerado comsearch_path = latamautomation/db/schemas/performance.rb— gerado comsearch_path = performance
Arquivos alterados
automation/Rakefile— sobrescrevedb:schema:dumppara chamar o dumper por schema e adicionadb:schemas:loadautomation/.standalone_migrations— aponta o caminho de schema paradb/schemas/public.rb(usado pelostandalone_migrationscomo gatilho do dump do schema default)
Tasks Rake customizadas
```ruby namespace :db do namespace :schemas do SCHEMAS = %w[public latam performance].freeze
task dump: :environment do
SCHEMAS.each do |schema|
ActiveRecord::Base.connection.execute("SET search_path TO #{schema}")
filename = "db/schemas/#{schema}.rb"
File.open(filename, "w") do |file|
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
end
puts "Dumped #{schema} → #{filename}"
end
ActiveRecord::Base.connection.execute("SET search_path TO public")
end
task load: :environment do
SCHEMAS.each do |schema|
filename = "db/schemas/#{schema}.rb"
next unless File.exist?(filename)
ActiveRecord::Base.connection.execute("SET search_path TO #{schema}")
load(File.expand_path(filename))
puts "Loaded #{filename} → #{schema}"
end
ActiveRecord::Base.connection.execute("SET search_path TO public")
end end end ```
Como verificar
bash
make leads.db.migrate # roda as migrations
rake db:schemas:dump # gera db/schemas/*.rb
cat automation/db/schemas/latam.rb # deve listar as tabelas de latam
cat automation/db/schemas/performance.rb # deve listar as tabelas de performance
rake db:schemas:load # deve recriar todos os schemas a partir dos arquivos
Documentação
— (não registrado na spec original)