ruby-on-rails rails - Différence entre rake db:migrate db:reset et db:schéma:load




migration change (5)

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.

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 un rake 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é.


Pour 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.


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 de schema.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 comme schema.rb dans schema.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

  • db: migrate exécute des migrations (simples) qui n'ont pas encore été 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: schéma: load, db: seed

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

Généralement, vous utiliseriez db: migrate après avoir modifié le schéma via de nouveaux fichiers de migration (cela n'a de sens que s'il y a 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 ça maintenant:

  • db: create crée la base de données pour l'env courant
  • db: create: tout crée les bases de données pour tous les envs
  • db: drop supprime la base de données pour l'env courant
  • db: drop: tout supprime les bases de données pour tous les envs
  • db: migrate exécute des migrations pour les env courants qui n'ont pas encore été exécutés
  • db: migrate: up exécute une migration spécifique
  • db: migrate: recule d'une migration spécifique
  • db: migrate: le statut indique l' état actuel de la migration
  • db: rollback annule la dernière migration
  • db: forward avance 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 env actuelle
  • db: schema: dump vide le schéma de l'env courant (et semble aussi créer le db)

  • db: setup exécute db: schéma: load, db: seed

  • db: reset exécute db: drop db: configure
  • db: migrate: exécute redo (db: migrate: bas db: migrate: haut) ou (db: rollback db: migrate) en fonction de la migration spécifiée
  • db: migrate: réinitialise exécute db: supprime db: crée 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)


Oui, il existe deux options possibles que vous pouvez transmettre aux validations pour les champs facultatifs :allow_blank ou :allow_nil , qui :allow_nil les validations sur blank champs blank et nil . Si vous modifiez votre validation de la manière suivante, vous devriez obtenir le comportement souhaité:

validates_uniqueness_of :acronym, :allow_blank => true, :scope => [:group_id], :case_sensitive => false






ruby-on-rails ruby database rake