Um arquivo de schema por schema do PostgreSQL

TLDR: Trocar o schema.rb único por um arquivo por schema do PostgreSQL em db/schemas/, dando visibilidade completa de public, latam e performance.

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:load recriaria apenas as tabelas de public
  • 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:dump e db:schemas:load substituem as embutidas

Fora de escopo

Limitações aceitas conscientemente:

  • O SchemaDumper do AR continua sem capturar PKs compostas (igual ao schema.rb)
  • Os nomes de tabela aparecem sem o prefixo do schema em cada arquivo (ex.: create_table "cadastro_gtm" dentro de latam.rb) — é o isolamento por arquivo, e é intencional
  • db:schema:load (o padrão do standalone_migrations) continua usando só public.rb; a carga completa exige db:schemas:load

Mudanças

Arquivos novos

  • automation/db/schemas/public.rb — gerado com search_path = public
  • automation/db/schemas/latam.rb — gerado com search_path = latam
  • automation/db/schemas/performance.rb — gerado com search_path = performance

Arquivos alterados

  • automation/Rakefile — sobrescreve db:schema:dump para chamar o dumper por schema e adiciona db:schemas:load
  • automation/.standalone_migrations — aponta o caminho de schema para db/schemas/public.rb (usado pelo standalone_migrations como 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)