web-dev-qa-db-fra.com

Quelle est la différence entre db: test: clone, db: test: clone_structure, db: test: load et db: test: prepare?

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)?

70
Nate Berkopec

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.

65
bricker

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

21
brian