Vous devrez admettre, à un débutant de Rails et bases de données, l'explication officielle sur rubyonrails.org fait que ces quatre tâches sonnent exactement de la même manière. Quote:
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 la structure et le schéma. Et quelle est la différence entre le chargement du schéma de l'environnement actuel et le simple chargement de schema.rb?
À quel point ces tâches sont-elles similaires (ou différentes)?
Très bonne question. Si je suis tombé perplexe, j'ai plongé dans la source Rails et j'ai tiré database.rake
. Maintenant, c'est plus clair:
db:test:clone
n'est qu'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.sql
fichier:
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 dans 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 avertit si des migrations sont en attente et, dans le cas contraire, exécute db:test:clone_structure
(en utilisant le {Rails_env}_structure.sql
fichier) ou db:test:load
(en utilisant le schema.rb
fichier), en fonction du format du schéma (c'est un peu déroutant pour moi, peut-être que quelqu'un d'autre peut le développer):
task :prepare => 'db:abort_if_pending_migrations' do
# ...
db_namespace[{ :sql => 'test:clone_structure', :Ruby => 'test:load' }[ActiveRecord::Base.schema_format]].invoke
end
J'espère que cela clarifie les choses! Encore une fois, parcourir le fichier database.rake est facile et éclaircira toutes les autres questions que vous pourriez avoir. Ce lien va à la ligne qui est le début du :test
espace de noms.
Ce n'est en fait pas tout à fait la même chose. Chacune de ces tâches qui contiennent le "schéma" de Word agit sur le fichier .../db/schema.rb. schema.rb est effectivement l'état de votre schéma après avoir appliqué toutes les migrations. Il peut être exécuté pour restaurer votre schéma plutôt que d'exécuter toutes les migrations db (ce qui peut prendre beaucoup de temps si vous avez beaucoup de migrations).
N'importe laquelle des tâches avec la "structure" de Word, agissez sur le fichier {Rails.env} _structure.sql. Ce fichier est utilisé lorsque votre schéma contient des constructions qui ne peuvent pas être exprimées dans le fichier schema.rb. Par exemple, si vous utilisez des fonctionnalités spécifiques à un SGBDR particulier. Sous les couvertures, Rails produit ce fichier en utilisant l'utilitaire de vidage de schéma approprié pour votre SGBDR. Pour restaurer le schéma, il lit le fichier et exécute les instructions SQL à nouveau à l'aide d'un outil spécifique au SGBDR .
Rails sait s'il faut suivre la route schema.rb ou la route structure.sql selon que vous avez défini ou non
config.active_record.schema_format =: sql
dans votre .../config/application.rb