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?
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'
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
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! :)
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
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
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