74 votes

Quelle est la différence entre db: test: clone, db: test: structure_clonable, db: test: charge et db: test: prepare?

Vous devez admettre, pour un débutant, que vous utilisez des rails et des bases de données, l'explication officielle de rubyonrails.org donne à ces quatre tâches un son identique. Citation:

 rake db:test:clone  Recreate the test database from
                    the current environment's database schema

rake db:test:clone_structure    Recreate the test database from the
                                development structure

rake db:test:load   Recreate the test database from the current schema.rb

rake db:test:prepare    Check for pending migrations and load the test schema
 

Je ne connais même pas la différence entre structure et schéma. Et quelle est la différence entre charger le schéma de l'environnement actuel et simplement charger schema.rb?

À quel point ces tâches sont-elles similaires (ou différentes)?

70voto

bricker Points 6213

Très bonne question. M'avait perplexe, j'ai donc plongé dans les rails de la source et a tiré database.rake. Maintenant c'est plus clair:

db:test:clone est juste une combinaison de db:schema:dump et db:test:load:

task :clone => %w(db:schema:dump db:test:load)

db:test:clone_structure utilise le {rails_env}_structure.fichier sql:

task :clone_structure => [ 'db:structure:dump', 'db:test:purge' ] do
  # skipped some code, here's what happens for MySQL:
  ActiveRecord::Base.establish_connection(:test)
  # ...
  IO.readlines("#{Rails.root}/db/#{Rails.env}_structure.sql").join.split("\n\n").each do |table|
    ActiveRecord::Base.connection.execute(table)
  end
end

db:test:load est le même que db:schema:load, mais l'invoque sur la base de données de test:

task :load => 'db:test:purge' do
  ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
  # ...
  db_namespace['schema:load'].invoke
end

db:test:prepare vous alerte si tout les migrations sont en attente, et si non, exécute db:test:clone_structure (en utilisant le {rails_env}_structure.fichier sql) ou db:test:load (à l'aide du schéma.rb fichier), en fonction du format de schéma (c'est un peu confus pour moi, peut-être quelqu'un d'autre peut l'agrandir):

task :prepare => 'db:abort_if_pending_migrations' do
  # ...
  db_namespace[{ :sql  => 'test:clone_structure', :ruby => 'test:load' }[ActiveRecord::Base.schema_format]].invoke
end

Espérons que cela efface! Encore une fois, en passant par la base de données.râteau fichier est facile et effacera toutes les autres questions que vous pourriez avoir. Que le lien va à la ligne qui est le début de l' :test de l'espace de noms.

22voto

brian Points 161

Ils sont réalité pas tout à fait la même chose. Chacune de ces tâches qui contiennent le mot "schéma" loi sur la .../db/schema.rb fichier. schéma.rb est effectivement l'état de votre schéma après l'application de toutes les migrations. Il peut être exécuté pour restaurer votre schéma plutôt que de courir à l'ensemble de la db migrations (ce qui peut prendre beaucoup de temps si vous avez beaucoup de migrations).

L'une des tâches avec le mot "structure", de la loi sur l' {Rails.env}_structure.fichier sql. Ce fichier est utilisé lors de votre schéma contient les constructions qui ne peuvent pas être exprimées dans le schéma.rb fichier. Par exemple, si vous utilisez des fonctions spécifiques à un SGBDR. Sous les couvertures, rails produit ce fichier à l'aide quel que soit le schéma de vidage de l'utilitaire approprié pour votre SGBDR. Pour restaurer le schéma, il lit le fichier et exécute les instructions SQL à nouveau à l'aide d'un SGBDR-outil spécifique.

Rails sait si le schéma.rb route ou de la structure.sql itinéraire en fonction de si oui ou non vous avez défini

config.active_record.schema_format = :sql

dans votre .../config/application.rb

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X