web-dev-qa-db-fra.com

Comment amorcer la base de données de production en utilisant la gemme Capistrano?

J'utilise Ruby on Rails 3.0.9 et je voudrais semer la base de données de production afin d'ajouter des enregistrements sans reconstruire toutes les bases de données (c'est-à-dire sans supprimer tous les enregistrements existants mais simplement en ajouter certains Je ne voudrais pas le faire car les nouvelles données sont nécessaires pour que l'application fonctionne.

Donc, puisque j'utilise la gemme Capistrano, je lance le cap -T commande dans la console afin de lister toutes les commandes disponibles et de savoir comment je peux accomplir ce que je vise:

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

Je ne suis pas sûr du mot "Recharger" présent dans le "Recharger la base de données avec les données de départ". phrase. Donc, ma question est: si je lance le cap deploy:seed La commande dans la console de ma machine locale supprimera toutes les données existantes dans la base de données de production, puis les remplira ou cette commande ajoutera-t-elle simplement les nouvelles données dans cette base de données comme je le souhaite?

36
Backo

Si vous utilisez bundler, la tâche capistrano devrait être:

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

et il peut être placé dans un fichier séparé, tel que lib/deploy/seed.rb et inclus dans votre fichier deploy.rb à l'aide de la commande suivante:

load 'lib/deploy/seed'
68
Javier Vidal

Cela a fonctionné pour moi:

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

27
Ioanna

En utilisant Capistrano 3, Rails 4 et SeedMigrations , j'ai créé une tâche seed.rb Capistrano sous/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

Mes migrations de départ sont maintenant complètement séparées de mes migrations de schéma et ont été exécutées en suivant le processus db: migrate. Quelle joie! :)

9
Martin Sommer

Essayez d'ajouter quelque chose comme ça dans votre 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
8
Mark

cap deploy:seed devrait être une référence à rake db:seed. Il ne doit pas supprimer les données existantes, sauf si vous l'avez spécifié pour le faire dans votre seed.rb.

La meilleure hypothèse pour le mot "Recharger" est que :seed est une commande sans état, je ne sais pas automatiquement où elle s'est arrêtée, comme les migrations régulières Rails. Donc, techniquement, vous seriez toujours en train de "recharger" la graine, chaque fois que vous l'exécutez. ... Une supposition sauvage, mais ça sonne bien, non?


Veuillez consulter Javier Vidal réponse ci-dessous

6
nowk

Après une discussion avec les auteurs de gemmes capistrano-Rails, j'ai décidé d'implémenter ce genre de tâches dans un joyau séparé. Je pense que cela aide à suivre l'idée DRY et à ne pas implémenter la même tâche encore et encore.

J'espère que cela vous aide: https://github.com/dei79/capistrano-Rails-collection

6
dei79