ruby-on-rails rails migration - Différence entre rake db: migrate db: reset et db: schéma: load
TLDR
Utilisation
-
rake db:migrate
Si vous voulez apporter des modifications au schéma -
rake db:reset
Si vous souhaitez supprimer la base de données, rechargez le schéma à partir deschema.rb
et reseed la base de données -
rake db:schema:load
Si vous voulez réinitialiser la base de données au schéma commeschema.rb
dansschema.rb
(Ceci supprimera toutes les données)
Explications
rake db:schema:load
va configurer le schéma tel qu'il est fourni dans le fichier schema.rb
. Ceci est utile pour une nouvelle installation de l'application car il ne prend pas autant de temps que db:migrate
Note importante,
db:schema:load
va supprimer les données sur le serveur.
rake db:migrate
apporte des modifications au schéma existant. C'est comme créer des versions de schéma. db:migrate
cherchera dans db/migrate/
pour tous les fichiers ruby et exécutera les migrations qui ne sont pas encore exécutées en commençant par les plus anciennes. Rails sait quel fichier est le plus ancien en regardant l'horodatage au début du nom de fichier de la migration. db:migrate
un avantage que les données peuvent également être mises dans la base de données. Ce n'est pas une bonne pratique. Il vaut mieux utiliser rake db:seed
pour ajouter des données.
rake db:migrate
fournit des tâches en up , en down etc. qui permettent des commandes comme rake db:rollback
et en font la commande la plus utile.
rake db:reset
fait un db:drop
et db:setup
Il supprime la base de données, la crée à nouveau, charge le schéma et s'initialise avec les données de base
Partie pertinente des commandes de github.com/rails/rails/blob/master/activerecord/lib/…
namespace :schema do
desc 'Creates a db/schema.rb file that is portable against any DB supported by Active Record'
task :dump => [:environment, :load_config] do
require 'active_record/schema_dumper'
filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema.rb')
File.open(filename, "w:utf-8") do |file|
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
end
db_namespace['schema:dump'].reenable
end
desc 'Loads a schema.rb file into the database'
task :load => [:environment, :load_config, :check_protected_environments] do
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV['SCHEMA'])
end
# desc 'Drops and recreates the database from db/schema.rb for the current environment and loads the seeds.'
task :reset => [ 'db:drop', 'db:setup' ]
namespace :migrate do
# desc 'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
task :redo => [:environment, :load_config] do
if ENV['VERSION']
db_namespace['migrate:down'].invoke
db_namespace['migrate:up'].invoke
else
db_namespace['rollback'].invoke
db_namespace['migrate'].invoke
end
end
La différence entre rake db:migrate
et rake db:reset
est assez claire dans ma tête. La chose que je ne comprends pas est comment rake db:schema:load
différent des deux précédents.
Juste pour être sûr que je suis sur la même page:
-
rake db:migrate
- Exécute les migrations qui n'ont pas encore été exécutées. -
rake db:reset
- Efface la base de données (probablement unrake db:drop
+rake db:create
+rake db:migrate
) et lance la migration sur une nouvelle base de données.
S'il vous plaît aider à clarifier, si ma compréhension a mal tourné.
Vous pouvez simplement regarder dans les tâches Active Record Rake car c'est là où je crois qu'ils vivent comme dans ce fichier. https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/lib/active_record/tasks/database_tasks.rb
Qu'est-ce qu'ils font, c'est votre question, n'est-ce pas?
Cela dépend d'où ils viennent et c'est juste et un exemple pour montrer qu'ils varient en fonction de la tâche. Ici, nous avons un fichier différent rempli de tâches.
https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/Rakefile
qui a ces tâches.
namespace :db do
task create: ["db:mysql:build", "db:postgresql:build"]
task drop: ["db:mysql:drop", "db:postgresql:drop"]
end
Cela peut ne pas répondre à votre question, mais pourrait vous donner un aperçu de aller de l'avant et regarder la source, en particulier les fichiers râteau et les tâches. Comme ils font du bon travail pour vous aider à utiliser les rails, ils ne documentent pas toujours bien le code. Nous pourrions tous aider si nous savons ce qu'il est censé faire.