Différence entre rake db: migrate db: reset et db: schema: load


619

La différence entre rake db:migrateet rake db:resetest assez claire dans ma tête. Ce que je ne comprends pas, c'est commentrake db:schema:load les deux précédents sont différents.

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 (fait probablement un rake db:drop+ rake db:create+ rake db:migrate) et exécute la migration sur une nouvelle base de données.

Veuillez aider à clarifier, si ma compréhension a mal tourné.


10
Ça rake --tasksaide?
zx1986

Vous devriez consulter ce blog. jacopretorius.net/2014/02/…
Bishisht Bhatta

Votre compréhension de rake db:migrateest correcte, mais votre compréhension de rake db:resetn'est pas bonne . Voir la réponse la plus haute, de moritz.
Magne

1
BTW, comme des rails 5, ces commandes peuvent être invoquées comme rails db:migrate, rails db:reset, rails db:schema:load. Voir stackoverflow.com/questions/38403533/…
Purplejacket

Réponses:


1303
  • db: migrer exécute des migrations (uniques) qui ne sont pas encore exécutées.
  • db: create crée la base de données
  • db: drop supprime la base de données
  • db: schema: load crée des tables et des colonnes dans la base de données (existante) après schema.rb

  • db: setup fait db: create, db: schema: load, db: seed

  • db: reset fait db: drop, db: setup
  • db: migrate: reset fait db: drop, db: create, db: migrate

En règle générale, vous utiliseriez db: migrate après avoir apporté des modifications au schéma via de nouveaux fichiers de migration (cela n'a de sens que s'il existe déjà des données dans la base de données). db: schema: load est utilisé lorsque vous configurez une nouvelle instance de votre application.

J'espère que ça aide.


MISE À JOUR pour les rails 3.2.12:

Je viens de vérifier la source et les dépendances sont comme ceci maintenant:

  • db: create crée la base de données pour l'environnement actuel
  • db: create: all crée les bases de données pour tous les envs
  • db: drop supprime la base de données pour l'environnement actuel
  • db: drop: all supprime les bases de données pour tous les envs
  • db: migrate exécute des migrations pour l'environnement actuel qui ne sont pas encore exécutées
  • db: migrate: up exécute une migration spécifique
  • db: migrate: down annule une migration spécifique
  • db: migrate: le statut affiche le statut de migration actuel
  • db: la restauration annule la dernière migration
  • db: forward fait avancer la version actuelle du schéma vers la suivante
  • db: seed (uniquement) exécute le fichier db / seed.rb
  • db: schema: load charge le schéma dans la base de données d'env actuelle
  • db: schema: dump vide le schéma de l'environnement actuel (et semble également créer la base de données)

  • db: le programme d'installation exécute db: schema: load, db: seed

  • db: reset s'exécute db: drop db: setup
  • db: migrate: redo s'exécute (db: migrate: down db: migrate: up) ou (db: rollback db: migrate) selon la migration spécifiée
  • db: migrer: réinitialiser s'exécute db: supprimer db: créer db: migrer

Pour plus d'informations, veuillez consulter https://github.com/rails/rails/blob/v3.2.12/activerecord/lib/active_record/railties/databases.rake (pour Rails 3.2.x) et https: // github .com / rails / rails / blob / v4.0.5 / activerecord / lib / active_record / railties / databases.rake (pour Rails 4.0.x)


16
Voici le fichier avec les réponses :) - github.com/rails/rails/blob/master/activerecord/lib/…
cutalion

3
@cutation: db: setup ne lance sûrement pas db: migrate, car il serait beaucoup trop fragile d'exécuter toutes les migrations juste pour une configuration db (c'est à cela que sert schema.rb).
moritz

2
J'exécute db: reset et ça sème mon db. Pourquoi est-ce possible?
Alejandro Riedel

db: le programme d'installation s'exécute également db:createsi nécessaire. Au moins à partir des rails 4.0.2.
Dan

Rails 4 fonctionnera rake db:migratelors de l'appel rake db:setups'il y a des migrations en attente mais n'exécutera pas les migrations en attente.
Pooyan Khosravi

24

TLDR

Utilisation

  • rake db:migrate Si vous souhaitez apporter des modifications au schéma
  • rake db:resetSi vous souhaitez supprimer la base de données, recharger le schéma à partir de schema.rbet réamorcer la base de données
  • rake db:schema:loadSi vous souhaitez réinitialiser la base de données au schéma comme indiqué dans schema.rb(Cela supprimera toutes les données)

Explications

rake db:schema:loadconfigurera le schéma comme indiqué dans le schema.rbfichier. Ceci est utile pour une nouvelle installation de l'application car cela ne prend pas autant de temps quedb:migrate

Remarque importante, db:schema:loadva supprimer des données sur le serveur.

rake db:migrateapporte des modifications au schéma existant. C'est comme créer des versions de schéma. db:migraterecherchera db/migrate/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 du fichier de migration. db:migratevient avec l'avantage que les données peuvent également être mises dans la base de données. Ce n'est en fait pas une bonne pratique. Il vaut mieux l'utiliser rake db:seedpour ajouter des données.

rake db:migratefournit des tâches vers le haut , vers le bas, etc. qui permettent des commandes comme rake db:rollbacket en font la commande la plus utile.

rake db:resetfait un db:dropet db:setup
il supprime la base de données, la crée à nouveau, charge le schéma et initialise avec les données de départ

Partie pertinente des commandes de databases.rake


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

Donc, si vous créez votre schéma de production à l'aide de db: schema: load (créé à partir d'une série de migrations précédentes), vous devrez savoir quelles migrations (celles qui ont participé à la création du schéma initial.rb) n'ont pas besoin d'être exécutées à l'avenir invocations de db: migrer?
CanadaIT

2

Pour autant que je comprends, il va supprimer votre base de données et la recréer en fonction de votre db/schema.rbfichier. C'est pourquoi vous devez vous assurer que votre schema.rbfichier est toujours à jour et sous contrôle de version.


0

Vous pouvez simplement regarder dans les tâches Active Record Rake car c'est là que je pense 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 est votre question à droite?

Cela dépend d'où ils viennent et c'est juste un exemple pour montrer qu'ils varient en fonction de la tâche. Ici, nous avons un fichier différent plein 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 ne répondra peut-être pas à votre question, mais pourrait vous donner un aperçu de la suite et examiner la source, en particulier les fichiers et les tâches de râteau. Comme ils font un très bon travail pour vous aider à utiliser les rails, ils ne documentent pas toujours bien le code. Nous pourrions tous aider là-bas si nous savons ce qu'il est censé faire.


Veuillez citer les parties pertinentes de l'article au cas où il serait supprimé. Ne suggérez pas de faire quelque chose sans expliquer pourquoi.
PhilT

0

MIS À JOUR pour Rails 5:

db:create- Crée la base de données pour l' environnement RAILS_ENV actuel . Si RAILS_ENV n'est pas spécifié, il s'agit par défaut des bases de données de développement et de test.

db:create:all - Crée la base de données pour tous les environnements.

db:drop- Supprime la base de données pour l' environnement RAILS_ENV actuel . Si RAILS_ENV n'est pas spécifié, il s'agit par défaut des bases de données de développement et de test.

db:drop:all - Supprime la base de données pour tous les environnements.

db:migrate- Exécute des migrations pour l'environnement actuel qui ne sont pas encore exécutées. Par défaut, il exécutera les migrations uniquement dans l'environnement de développement.

db:migrate:redo- Exécute db: migrate: down et db: migrate: up ou db: migrate: rollback et db: migrate: up en fonction de la migration spécifiée.

db:migrate:up - Exécute la version VERSION de migration donnée.

db:migrate:down - Exécute le down pour la VERSION de migration donnée.

db:migrate:status - Affiche l'état actuel de la migration.

db:migrate:rollback - Annule la dernière migration.

db:version - Imprime la version actuelle du schéma.

db:forward - Pousse le schéma à la prochaine version.

db:seed- Exécute le fichier db / seeds.rb .

db:schema:loadRecrée la base de données à partir du fichier schema.rb .

db:schema:dumpVide le schéma de l'environnement actuel dans db / schema.rb .

db:structure:load- Recrée la base de données à partir du fichier structure.sql .

db:structure:dump- Vide le schéma de l'environnement actuel dans db / structure.sql . (Vous pouvez spécifier un autre fichier avec SCHEMA=db/my_structure.sql)

db:setupExécute db: create , db: schema: load et db: seed .

db:resetExécute db: drop et db: setup . db:migrate:reset- Exécute db: drop , db: create et db: migrate .

db:test:prepare- Vérifiez les migrations en attente et chargez le schéma de test. (Si vous exécutez rake sans argument, il le fera par défaut.)

db:test:clone - Recréez la base de données de test à partir du schéma de base de données de l'environnement actuel.

db:test:clone_structure- Similaire à db: test: clone , mais il garantira que votre base de données de test a la même structure, y compris les jeux de caractères et les classements, que la base de données de votre environnement actuel.

db:environment:set- Définissez l' environnement RAILS_ENV actuel dans la table ar_internal_metadata . (Utilisé dans le cadre de la vérification de l'environnement protégé.)

db:check_protected_environments- Vérifie si une action destructrice peut être effectuée dans l' environnement RAILS_ENV actuel . Utilisé en interne lors de l'exécution d'une action destructrice telle que db: drop ou db: schema: load .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.