web-dev-qa-db-fra.com

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

La différence entre rake db:migrate et rake db:reset est assez claire dans ma tête. Ce que je ne comprends pas, c'est comment rake db:schema:load est 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 un rake db:drop + rake db:create + rake db:migrate) et exécute la migration sur une nouvelle base de données.

S'il vous plaît aider à clarifier, si ma compréhension a mal tourné.

584
Gaurav Agarwal
  • db: migrate 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) à la suite de schema.rb

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

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

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

J'espère que ça aide.


UPDATE pour Rails 3.2.12:

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

  • db: create crée la base de données pour l'env en cours
  • db: create: all crée les bases de données pour tous les envs
  • db: drop supprime la base de données pour l'env en cours
  • db: drop: all supprime les bases de données pour tous les envs
  • db: migrate exécute les migrations de l'env en cours qui n'ont pas encore été exécutées
  • db: migrate: up exécute une migration spécifique
  • db: migrate: down annule une migration spécifique
  • db: migrate: status indique le statut de migration actuel.
  • db: rollback annule la dernière migration
  • db: forward avance la version actuelle du schéma vers la suivante
  • db: seed (seulement) exécute le fichier db/seed.rb
  • db: schema: load charge le schéma dans la base de données de l'env en cours.
  • db: schema: dump vide le schéma de l'env en cours (et semble également créer la base de données)

  • db: setup exécute db: schema: load, db: seed

  • db: reset exécute db: drop db: setup
  • db: migrate: redo s'exécute (db: migrate: down db: migrate: up) ou (db: rollback db: migrate) en fonction de la migration spécifiée
  • db: migrate: reset exécute db: drop db: create db: migrate

Pour plus d'informations, consultez 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)

1239
moritz

TLDR

Utilisation

  • rake db:migrate Si vous voulez modifier le schéma
  • rake db:reset Si vous voulez supprimer la base de données, rechargez le schéma à partir de schema.rb, puis ré-alimentez la base de données.
  • rake db:schema:load Si vous voulez réinitialiser la base de données sur le schéma, comme indiqué dans schema.rb (Ceci supprimera toutes les données)

Des explications

rake db:schema:load configure le schéma comme indiqué dans le fichier schema.rb. Ceci est utile pour une nouvelle installation d'application car cela ne prend pas autant de temps que db:migrate

Remarque importante, db:schema:load supprimera 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 recherchera dans db/migrate/ tous les fichiers Ruby et exécutera les migrations qui ne sont pas encore exécutées, en commençant par le plus ancien. Rails sait quel fichier est le plus ancien en regardant l'horodatage au début du nom de fichier de la migration. db:migrate présente l'avantage de pouvoir également mettre des données dans la base de données. Ce n'est en fait pas une bonne pratique. Il est préférable d’utiliser rake db:seed pour ajouter des données.

rake db:migrate fournit des tâches p , down etc, qui activent des commandes telles que rake db:rollback et en font la commande la plus utile.

rake db:reset effectue un db:drop et db:setup
Il supprime la base de données, la recrée, charge le schéma et s'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
21
sudo bangbang

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

2
Simon Bagreev

Vous pouvez simplement regarder dans les tâches Active Record Rake, car c’est là où je pense qu’elles 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 et 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épond peut-être pas à votre question, mais pourrait vous donner un aperçu de la façon dont vous allez procéder et examiner la source, en particulier les fichiers et les tâches de rake. Comme ils font un très bon travail pour vous aider à utiliser Rails, ils ne documentent pas toujours le code aussi bien. Nous pourrions tous aider là-bas si nous savons ce qu’il est censé faire.

0
Douglas G. Allen