Подтвердить что ты не робот

Как засеять производственную базу данных с помощью драгоценного камня Capistrano?

Я использую Ruby on Rails 3.0.9, и я хотел бы засеять производственную базу данных, чтобы добавить некоторую запись без повторной сборки всей базы данных (то есть, не удаляя все существующие записи, а просто добавляя некоторые из них, а не уже существует). Я хотел бы сделать это, потому что новые данные необходимы, чтобы приложение работало.

Итак, поскольку я использую камень Capistrano, я запускаю команду cap -T в консоли, чтобы перечислить все доступные команды и узнать, как я могу достичь цели:

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

Я не уверен, что слово "перезагрузка" присутствует в "Перезагрузка базы данных с данными семени". предложение. Итак, мой вопрос: , если я запустил команду cap deploy:seed в консоли на моем локальном компьютере, процесс посева удалит все существующие данные в производственной базе данных, а затем заполнит ее или эта команда просто добавит новые данные в эту базу данных, как я собираюсь сделать?

4b9b3361

Ответ 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