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:
- Recebe o caminho do dump pela variável de ambiente
DUMP_FILE= - Detecta se o arquivo é
.zipou.gze descomprime na hora, via pipe - Roda
psqldentro do containermkt-automation-dbjá em execução, viadocker compose exec - 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)