2011-09-18 64 views
32

我正在使用Ruby on Rails 3.0.9,並且我想要生成生產數據庫以便添加一些記錄而不重新構建所有數據庫(即,不刪除所有現有記錄,而只是添加一些還沒有的人)。我想這樣做,因爲需要新的數據才能使應用程序正常工作。如何使用Capistrano創建生產數據庫?

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

我不是:

所以,既然我現在用的是Capistrano的寶石,我爲了列出所有可用的命令,並知道我可以完成我的目標是運行在控制檯中cap -T命令務必在「用種子數據重新加載數據庫」中出現「重新加載」一詞。句子。所以,我的問題是:如果我在本地機器的控制檯上運行cap deploy:seed命令,播種過程會刪除生產數據庫中的所有現有數據,然後填充該數據,或者該命令只是將該數據庫中的新數據添加爲I目標是做什麼?

回答

67

如果使用捆綁,那麼Capistrano的任務應該是:

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 

,它可能使用下面的命令放置在一個單獨的文件,如lib/deploy/seed.rb幷包含在您deploy.rb文件:

load 'lib/deploy/seed' 
+0

它可能放置在單獨的文件中的原因是什麼? – Backo

+2

有時,將您的通用定義放在單獨的文件中很好,因此可以輕鬆移植到另一個項目。如果添加了lib/deploy/seed.rb文件,則將以下內容添加到deploy.rb文件的頂部以包含它:load'lib/deploy/seed' – Geekygecko

+1

非常感謝!實際上,你想要:運行cd#{release_path} && bundle exec rake db:seed RAILS_ENV =#運行「cd#{current_path}; bundle exec rake db:seed RAILS_ENV =#{rails_env}」working lika charm:D –

6

cap deploy:seed應該基本上是對 rake db:seed的參考。它不應該刪除現有數據,除非您在 seed.rb中指定它。

「重新加載」一詞的最佳假設是 :seed是一個無狀態命令,我不會自動知道它從何處停止,就像普通的rails遷移一樣。所以從技術上說,每當你運行它時,你總是會「重新加載」種子。 ...瘋狂的猜測,但聽起來不錯,不是嗎?


請查看Javier Vidal回答以下

+0

是的,這應該聽起來不錯。 – Backo

+2

cap部署:種子拋出「任務'部署:種子'不存在」 –

+1

'rails $ cap -e deploy:seed''任務'deploy:seed'不存在。' –

7

嘗試增加這樣的事情在你的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

與Capistrano的護欄寶石作家的討論之後,我決定實施此一種單獨的寶石中的任務。我認爲這有助於遵循DRY的想法,而不是一遍又一遍地執行相同的任務。

我希望它可以幫助你:https://github.com/dei79/capistrano-rails-collection

+0

繼dei79的github上頁我得到一個快速的結果:1。 Gemfile中:'寶石 'Capistrano的護欄,collection'' 2.'束install' 3. Capfile:'需要' Capistrano的/導軌/ collection'' 4 'cap production rails:rake:db:seed' –

+0

是的,我最喜歡的解決方案在這裏。超棒的男人! –

6

使用Capistrano的3,軌道4,和SeedMigrations,我下的/ lib目錄/ Capistrano酒店/任務創造了Capistrano的seed.rb任務:

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 

我的種子遷移現在完全獨立於我的模式遷移,並且遵循db:migrate過程運行。多麼愉快!:)

+0

我認爲它需要命名爲'seed.rake'以使它使用默認的Capfile自動加載。 – Troy

23

這爲我工作:

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

+0

把這個放入lib/capistrano/tasks中,並將其命名爲XXX.rake –

+2

+ 1,用於使用'with rails_env:fetch(:stage)' – lucke84