Как засеять производственную базу данных с помощью драгоценного камня Capistrano?
Я использую Ruby on Rails 3.0.9, и я хотел бы засеять производственную базу данных, чтобы добавить некоторую запись без повторной сборки всей базы данных (то есть, не удаляя все существующие записи, а просто добавляя некоторые из них, а не уже существует). Я хотел бы сделать это, потому что новые данные необходимы, чтобы приложение работало.
Итак, поскольку я использую камень Capistrano, я запускаю команду cap -T
в консоли, чтобы перечислить все доступные команды и узнать, как я могу достичь цели:
$ cap -T
=> ...
=> cap deploy:seed # Reload the database with seed data.
=> ...
Я не уверен, что слово "перезагрузка" присутствует в "Перезагрузка базы данных с данными семени". предложение. Итак, мой вопрос: , если я запустил команду cap deploy:seed
в консоли на моем локальном компьютере, процесс посева удалит все существующие данные в производственной базе данных, а затем заполнит ее или эта команда просто добавит новые данные в эту базу данных, как я собираюсь сделать?
Ответы
Ответ 1
Если вы используете 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'
Ответ 2
Это сработало для меня:
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
Ответ 3
Попробуйте добавить что-то вроде этого в 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
Ответ 4
cap deploy:seed
должен быть в основном ссылкой на rake db:seed
. Он не должен удалять существующие данные, если вы не указали это в своем seed.rb
.
Лучшее предположение для слова "Перезагрузка" заключается в том, что :seed
- это команда без состояния, я не знаю, где она остановилась, как регулярные миграции рельсов. Так что технически вы всегда будете "перезагружать" семя, каждый раз, когда вы его запускаете.... Дикая догадка, но это звучит хорошо, нет?
Пожалуйста, просмотрите Javier Vidal
ответ ниже
Ответ 5
Используя Capistrano 3, Rails 4 и SeedMigrations, я создал задачу Capistrano seed.rb в /lib/capistrano/tasks:
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. Какая радость!:)
Ответ 6
После обсуждения с авторами capistrano-rails я решил реализовать этот вид задач в отдельном драгоценном камне. Я думаю, что это помогает следовать идее DRY и не повторять одну и ту же задачу снова и снова.
Надеюсь, это вам поможет: https://github.com/dei79/capistrano-rails-collection