如何使用Capistrano gem种植生产数据库?

Bac*_*cko 36 ruby capistrano ruby-on-rails seed ruby-on-rails-3

我正在使用Ruby on Rails 3.0.9并且我希望播种生产数据库以便添加一些记录而无需重新构建所有数据库(即,不删除所有现有记录但只添加一些尚未存在的记录) .我想这样做是因为需要新数据才能使应用程序正常工作.

因此,由于我正在使用Capistrano gem,我cap -T在控制台中运行命令以列出所有可用命令并知道如何实现我的目标:

$ cap -T
=> ...
=> cap deploy:seed          # Reload the database with seed data.
=> ...
Run Code Online (Sandbox Code Playgroud)

我不确定"使用种子数据重新加载数据库"中出现的"重新加载"这个词.句子.所以,我的问题是:如果我cap deploy:seed在本地机器上的控制台中运行命令,播种过程将删除生产数据库中的所有现有数据,然后填充它,或者该命令只是在我想要的数据库中添加新数据做?

Jav*_*dal 68

如果您使用的是bundler,那么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
Run Code Online (Sandbox Code Playgroud)

它可以放在一个单独的文件中,例如lib/deploy/seed.rb并使用以下命令包含在deploy.rb文件中:

load 'lib/deploy/seed'
Run Code Online (Sandbox Code Playgroud)

  • 实际上,你想要:`run"cd#{release_path} && bundle exec rake db:seed RAILS_ENV =#{rails_env}"`你可能想要使用你已部署的版本(并在你推出代码之前播种) .&&还确保您可以更改目录,如果不能,则会失败 (7认同)
  • 不要忘记指定要运行它的角色.如果您有多台计算机,您可能会考虑仅在您的数据库上运行它.`task:seed,:roles =>:db do ...` (5认同)
  • 有时将公共定义放在单独的文件中很好,因此很容易移植到另一个项目.如果添加了lib/deploy/seed.rb文件,则将以下内容添加到deploy.rb文件的顶部以包含它:load'lib/deploy/seed' (2认同)

小智 27

这对我有用:

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
Run Code Online (Sandbox Code Playgroud)

capistrano 3,Rails 4

  • +1用于使用rails_env:fetch(:stage)`的良好和干净的用法 (3认同)
  • 把它放到lib/capistrano/tasks中并称之为XXX.rake (2认同)

Mar*_*mer 9

使用Capistrano 3,Rails 4和SeedMigrations,我在/ lib/capistrano/tasks下创建了一个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
Run Code Online (Sandbox Code Playgroud)

我的种子迁移现在完全独立于模式迁移,并在db:migrate进程之后运行.真高兴啊!:)


Mar*_*ark 8

尝试在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
Run Code Online (Sandbox Code Playgroud)


now*_*owk 6

cap deploy:seed应该基本上是一个参考rake db:seed.它不应该删除现有数据,除非您在其中指定了这样做seed.rb.

"Reload"这个词的最佳假设:seed是无状态命令,我不会自动知道它停止的位置,就像常规的rails迁移一样.因此从技术上讲,每次运行时,你都会"重新加载"种子.......一个疯狂的猜测,但听起来不错,不是吗?


请查看Javier Vidal以下答案

  • cap deploy:种子抛出"任务`部署:种子'不存在" (2认同)

dei*_*i79 6

在与capistrano-rails gem作者讨论后,我决定在一个单独的gem中实现这种任务.我认为这有助于遵循DRY的想法而不是一遍又一遍地执行相同的任务.

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