![](/img/trans.png)
[英]Rails + Capistrano, seed production database with file uploads?
[英]How to seed the production database using the Capistrano gem?
我正在使用Ruby on Rails 3.0.9并且我希望播种生产数据库以便添加一些记录而无需重新构建所有数据库 (即,不删除所有现有记录但只添加一些尚未存在的记录) 。 我想这样做是因为需要新数据才能使应用程序正常工作。
因此,由于我使用的是Capistrano gem,我在控制台中运行cap -T
命令以列出所有可用命令并知道如何实现我的目标:
$ cap -T
=> ...
=> cap deploy:seed # Reload the database with seed data.
=> ...
我不确定“使用种子数据重新加载数据库”中出现的“重新加载”这个词。 句子。 所以,我的问题是: 如果我在本地机器的控制台中运行cap deploy:seed
命令,播种过程将删除生产数据库中的所有现有数据,然后填充它或者该命令只是在该数据库中添加新数据我的目标是什么?
如果您使用的是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
它可能放在一个单独的文件中,例如lib/deploy/seed.rb
并使用以下命令包含在deploy.rb文件中:
load 'lib/deploy/seed'
这对我有用:
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,Rails 4
使用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
我的种子迁移现在完全独立于模式迁移,并在db:migrate进程之后运行。 真高兴啊! :)
尝试在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
在与capistrano-rails gem作者讨论后,我决定在一个单独的gem中实现这种任务。 我认为这有助于遵循DRY的想法而不是一遍又一遍地执行相同的任务。
我希望它可以帮到你: https : //github.com/dei79/capistrano-rails-collection
cap deploy:seed
应该基本上是对
rake db:seed
的引用。
除非您在
seed.rb
指定它,否则不应删除现有数据。
“Reload”这个词的最佳假设是
:seed
是一个无状态命令,我不会自动知道它停在哪里,就像常规的rails迁移一样。
所以从技术上讲,每次运行时,你都会“重新加载”种子。
......一个疯狂的猜测,但听起来不错,不是吗?
请查看下面的Javier Vidal
答案
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.