2011-09-18 15 views
32

Sto usando Ruby on Rails 3.0.9 e desidero seminare il database di produzione per aggiungere un record senza ricomporre tutto il database (ovvero, senza eliminare tutti i record esistenti ma aggiungendo solo alcuni di quelli non ancora esistenti). Mi piacerebbe farlo perché i nuovi dati sono necessari per far funzionare l'applicazione.Come seminare il database di produzione utilizzando la gemma Capistrano?

Quindi, dal momento che sto usando la gemma Capistrano, faccio funzionare l'ordine cap -T nella console per elencare tutti i comandi disponibili e di sapere come posso fare quello che mi propongo:

$ cap -T 
=> ... 
=> cap deploy:seed   # Reload the database with seed data. 
=> ... 

io non sono sicuro sulla parola "Ricarica" ​​presente nel "Ricarica il database con i dati seme". condanna, frase. Quindi, la mia domanda è: se eseguo il comando cap deploy:seed nella console sul mio computer locale, il processo di seeding cancella tutti i dati esistenti nel database di produzione e poi lo popola o questo comando aggiungerà solo i nuovi dati in quel database come mirare a fare?

risposta

67

Se si utilizza bundler, allora il compito Capistrano dovrebbe essere:

namespace :deploy do 
    desc "reload the database with seed data" 
    task :seed do 
    run "cd #{current_path}; bundle exec rake db:seed RAILS_ENV=#{rails_env}" 
    end 
end 

e potrebbe essere inserito in un file separato, come lib/deploy/seed.rb e inclusi nel file deploy.rb utilizzando seguente comando:

load 'lib/deploy/seed' 
+0

Qual è il motivo per cui potrebbe essere inserito in un file separato? – Backo

+2

A volte è bello avere la definizione comune in un file separato, quindi è facile portarlo su un altro progetto. Se hai aggiunto il file lib/deploy/seed.rb, aggiungi quanto segue all'inizio del file deploy.rb per includerlo: carica 'lib/deploy/seed' – Geekygecko

+1

Grazie mille !!! esegui "cd # {current_path}; bundle exec rake db: seed RAILS_ENV = # {rails_env}" ha funzionato il fascino di lika: D –

6

cap deploy:seed dovrebbe essere fondamentalmente un riferimento a rake db:seed. Non dovrebbe cancellare i dati esistenti, a meno che non l'abbia specificato per farlo nel tuo seed.rb.

Il presupposto migliore per la parola "Ricarica" ​​è che :seed è un comando senza stato, non so automaticamente da dove era stato interrotto, come le migrazioni regolari dei binari. Quindi tecnicamente tu "ricaricherai" il seme ogni volta che lo esegui. ... Un'ipotesi selvaggia, ma suona bene, no?


Si prega di vedere Javier Vidal risposta qui sotto

+0

Sì, che dovrebbe suonare bene. – Backo

+2

cap deploy: seed gira "il compito' deploy: seed 'non esiste " –

+1

' rails $ cap -e deploy: seed' 'L'attività' deploy: seed 'non esiste. –

7

Prova ad aggiungere qualcosa di simile nel tuo deploy.rb:

namespace :deploy do 
    desc "reload the database with seed data" 
    task :seed do 
    run "cd #{current_path}; rake db:seed RAILS_ENV=#{rails_env}" 
    end 
end 
5

Dopo una discussione con gli autori Capistrano-rails gemma ho deciso di attuare questa tipo di compiti in una gemma separata. Penso che questo aiuti a seguire l'idea DRY e non implementare lo stesso compito più e più volte.

Spero che ti aiuta: https://github.com/dei79/capistrano-rails-collection

+0

Seguendo la pagina github di dei79 ho ottenuto un risultato rapido: 1. Gemfile: 'gem 'capistrano-rails-collection' 2.' bundle install' 3. Capfile: 'require 'capistrano/rails/collection'' 4 . 'cap binari di produzione: rake: db: seed' –

+0

Sì, la mia soluzione preferita qui. Super fantastico uomo! –

6

Utilizzando Capistrano 3, 4 Rails, e SeedMigrations, ho creato un compito Capistrano seed.rb sotto/lib/Capistrano/compiti:

namespace :deploy do 
    desc 'Runs rake db:seed for SeedMigrations data' 
    task :seed => [:set_rails_env] do 
    on primary fetch(:migration_role) do 
     within release_path do 
     with rails_env: fetch(:rails_env) do 
      execute :rake, "db:seed" 
     end 
     end 
    end 
    end 

    after 'deploy:migrate', 'deploy:seed' 
end 

mio seme le migrazioni sono ora completamente separate dalle migrazioni dello schema e sono state eseguite seguendo il processo db: migrate. Che gioia!:)

+0

Penso che debba essere chiamato 'seed.rake' per portarlo al caricamento automatico usando il Capfile predefinito. – Troy

23

questo ha funzionato per me:

task :seed do 
puts "\n=== Seeding Database ===\n" 
on primary :db do 
    within current_path do 
    with rails_env: fetch(:stage) do 
     execute :rake, 'db:seed' 
    end 
    end 
end 
end 

Capistrano 3, 4 Rails

+0

Mettilo in lib/capistrano/tasks e chiamalo XXX.rake –

+2

+1 per un uso piacevole e pulito di 'con rails_env: fetch (: stage)' – lucke84

Problemi correlati