Как заполнить производственную базу данных, используя драгоценный камень Capistrano? - PullRequest
35 голосов
/ 18 сентября 2011

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

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

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

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

Ответы [ 6 ]

67 голосов
/ 16 февраля 2012

Если вы используете 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'
27 голосов
/ 22 мая 2014

Это сработало для меня:

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

8 голосов
/ 06 марта 2014

Используя 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.Какая радость!:)

7 голосов
/ 18 января 2012

Попробуйте добавить что-то подобное в ваш 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
6 голосов
/ 26 декабря 2013

После обсуждения с авторами самоцветов capistrano-rails я решил реализовать этот вид задач в отдельном самоцвете.Я думаю, что это помогает следовать идее «СУХОЙ» и не выполнять одну и ту же задачу снова и снова.

Надеюсь, это поможет вам: https://github.com/dei79/capistrano-rails-collection

6 голосов
/ 18 сентября 2011

cap deploy:seed в основном должно быть ссылкой на rake db:seed. Он не должен удалять существующие данные, если вы не указали это в своем seed.rb.

Лучшее предположение для слова "Перезагрузка" заключается в том, что :seed - это команда без сохранения состояния, я не знаю автоматически, где она остановилась, как при регулярных миграциях рельсов. Технически, вы всегда будете «перезагружать» семя, каждый раз, когда запускаете его. ... Дикая догадка, но звучит хорошо, нет?


Пожалуйста, просмотрите Javier Vidal ответ ниже

...