Différence entre rake db:migrate db:réinitialiser et db:schéma:charge

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 diffère 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é effectuées.
  • rake db:reset - efface la base de données 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 aidez à clarifier, si ma compréhension a mal tourné.

542
demandé sur ekremkaraca 2012-04-24 20:11:32

4 réponses

  • db:migrate fonctionne (unique) de migration qui n'ont pas exécuté encore.
  • db:create crée la base de données
  • db: drop supprime la base de données
  • db:schema:load crée des tableaux et des colonnes dans la base de données (existante) suivant le schéma.rb

  • db:le programme d'installation n'db:créer, db:schéma:la charge, db:graine

  • db:reset n'db:drop, db:le programme d'installation

typiquement, vous utilisez 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 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 aidera.


mise à jour pour 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 le courant env
  • db:create:tous les crée les bases de données pour tous les envs
  • db:drop les gouttes de la base de données pour le courant env
  • db:drop:tous les les gouttes de la bases de données pour tous les envs
  • db:migrate effectue des migrations pour le courant env qui n'ont pas exécuté encore
  • db: migrate: up exécute une migration spécifique
  • db:migrate: annule une migration spécifique
  • db: migrate: status montre l'état actuel statut migratoire
  • db:rollback annule la dernière migration
  • db:en avant les progrès de l'actuelle version de schéma pour le prochain
  • db:graine (uniquement) dirige le db/semence.dossier rb
  • db:schéma:load "151930920 des charges" le schéma dans le courant de l'env de la base de données
  • db: schéma: dump dumps le schéma actuel de l'env (et semble créer le db aussi bien)

  • db:le programme d'installation fonctionne db:schéma:la charge, db:graine

  • db:reset fonctionne db:abandon de la db:le programme d'installation
  • db:migrate:refaire fonctionne (db:migrate:db:migrate:vers le haut) ou (db:restauration db:migrate) en fonction sur la migration
  • db:migrate:reset fonctionne db:abandon de la db:create db:migrate

pour de plus amples 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)

1149
répondu moritz 2015-11-27 14:27:48

TLDR

Utiliser

  • rake db:migrate Si vous voulez faire des modifications du schéma
  • rake db:reset si vous voulez laisser tomber la base de données, rechargez le schéma de schema.rb , et rechargez la base de données
  • rake db:schema:load Si vous voulez réinitialiser la base de données de schéma tel que prévu dans schema.rb (Cela va supprimer toutes les données)

explications

rake db:schema:load mettra en place le schéma comme prévu dans le fichier schema.rb . C'est utile pour une nouvelle installation de l'application car il ne prend pas autant de temps que db:migrate

remarque Importante, db:schema:load sera 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 schema. db:migrate cherche dans db/migrate/ pour toute ruby file et exécute les migrations qui ne sont pas encore exécutées à partir de la plus ancienne. Les Rails savent quel fichier est le plus ancien en regardant l'horodatage au début du nom du fichier de migration. db:migrate vient avec un avantage que les données peuvent également être mis dans la base de données. Ce n'est effectivement 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 , vers le bas , etc, qui permet de commandes comme rake db:rollback et en fait la commande la plus utile.

rake db:reset est-ce un db:drop et db:setup

Il laisse tomber la base de données, la crée à nouveau, charge le schéma, et initialise avec les données de graine

partie pertinente des commandes des bases de données .râteau


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
16
répondu sudo bangbang 2016-09-14 00:09:49

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

2
répondu Simon Bagreev 2012-04-24 16:25:21

vous pourriez simplement regarder dans les tâches Active Record Rake comme c'est où je crois qu'ils vivent comme dans ce dossier. https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/lib/active_record/tasks/database_tasks.rb

Ce qu'ils font est votre question?

cela dépend d'où ils viennent et ce qui est juste et exemple pour montrer qu'ils varient en fonction de la tâche. Ici, nous avons un autre fichier 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 go ahead et regarder la source au-dessus en particulier les fichiers et les tâches de râteau. Comme ils font un assez bon travail de vous aider à utiliser les rails, ils ne le font pas toujours documentez bien le code. Nous pourrions tous y contribuer si nous savons ce que c'est censé faire.

0
répondu Douglas G. Allen 2016-12-04 22:24:09