Carregar dados a partir de um dump SQL

TLDR: Adicionar uma task Rake e um target de make que restauram um dump SQL só-de-dados dentro do container mkt-automation-db.

Contexto

O schema do banco já está no lugar via migrations. Falta popular com dados de produção, vindos de um dump SQL puro só-de-dados (~4,1 GB, zipado). O Rails não tem convenção embutida para isso — db:seed é para dados pequenos escritos em Ruby. O caminho certo é uma task Rake customizada que delega para o psql, consistente com as demais tasks db:*.

Abordagem

Como o dump é SQL puro (não o formato binário custom do pg_dump), o psql é a ferramenta correta de restore. A task:

  1. Recebe o caminho do dump pela variável de ambiente DUMP_FILE=
  2. Detecta se o arquivo é .zip ou .gz e descomprime na hora, via pipe
  3. Roda psql dentro do container mkt-automation-db já em execução, via docker compose exec
  4. Desabilita triggers durante o restore (SET session_replication_role = replica) para evitar violação de FK por ordem de inserção

A task roda fora do container automation (não precisa do ambiente Rails) — fala direto com o container do banco via psql.

Objetivos

  • Carregar todos os dados do dump no schema existente, sem recriar tabelas
  • Suportar arquivos comprimidos (.zip, .gz) sem exigir espaço em disco para descompressão
  • Encaixar nas convenções de make/rake já usadas no projeto

Fora de escopo

— (não registrado na spec original)

Mudanças

automation/Rakefile

Adicionar a task db:data:load:

```ruby namespace :db do namespace :data do desc “Load data from a SQL dump. Usage: rake db:data:load DUMP_FILE=path/to/dump.sql[.gz|.zip]” task :load do dump_file = ENV[“DUMP_FILE”] or raise “Usage: rake db:data:load DUMP_FILE=path/to/file” raise “File not found: #{dump_file}” unless File.exist?(dump_file)

  db = YAML.load_file("config/database.yml")["default"]
  psql_cmd = "psql -h #{db['host']} -p #{db['port'] || 5432} -U #{db['username']} #{db['database']}"

  cmd = case dump_file
        when /\.zip$/ then "unzip -p #{dump_file} | #{psql_cmd}"
        when /\.gz$/  then "gunzip -c #{dump_file} | #{psql_cmd}"
        else               "#{psql_cmd} < #{dump_file}"
        end

  puts "  → restoring #{dump_file}..."
  env = { "PGPASSWORD" => db["password"].to_s }
  system(env, "sh", "-c", cmd) or raise "Restore failed"
  puts "  ✓ done"
end   end end ```

.project/make/leads.mk

Adicionar o target:

makefile ### Load data from a SQL dump (usage: make leads.db.data.load DUMP_FILE=path/to/dump.sql.zip) leads.db.data.load: docker compose run --rm -v $(DUMP_FILE):/dump/data.sql.zip automation \ bundle exec rake db:data:load DUMP_FILE=/dump/data.sql.zip

O target monta o arquivo de dump local dentro do container para que a task Rake consiga acessá-lo.

Como verificar

bash make leads.db.data.load DUMP_FILE=~/dumps/dump_postgres_data_20260331.sql.zip # deve imprimir as contagens de linha da saída COPY do psql # depois, conferir por amostragem: docker compose exec mkt-automation-db psql -U $LEADS_DB_USER -d $LEADS_DB_DATABASE \ -c "SELECT COUNT(*) FROM latam.facebook_ads;"

Documentação

— (não registrado na spec original)