Was ist der Unterschied zwischen db: test: clone, db: test: clone_structure, db: test: load und db: test: prepare?

74

Sie müssen zugeben, dass für einen Neuling in Schienen und Datenbanken die offizielle Erklärung auf rubyonrails.org alle vier dieser Aufgaben genau gleich klingen lässt. Zitat:

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

Ich kenne nicht einmal den Unterschied zwischen Struktur und Schema. Und was ist der Unterschied zwischen dem Laden des Schemas der aktuellen Umgebung und dem Laden von schema.rb?

Wie ähnlich (oder unterschiedlich) sind diese Aufgaben?

Nate Berkopec
quelle

Antworten:

69

Sehr gute Frage. Hatte mich verblüfft, also tauchte ich in die Schienenquelle und hielt an database.rake. Jetzt ist es klarer:

  • db:test:cloneist nur eine Kombination aus db:schema:dumpund db:test:load:

    task :clone => %w(db:schema:dump db:test:load)
    
  • db:test:clone_structureverwendet die {rails_env}_structure.sqlDatei:

    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:loadist dasselbe wie db:schema:load, ruft es jedoch in der Testdatenbank auf:

    task :load => 'db:test:purge' do
      ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
      # ...
      db_namespace['schema:load'].invoke
    end
    
  • db:test:preparebenachrichtigt Sie, wenn Migrationen ausstehen und wenn nicht, je nach Schemaformat db:test:clone_structure(unter Verwendung der {rails_env}_structure.sqlDatei) oder db:test:load(unter Verwendung der schema.rbDatei) ausgeführt wird (dies ist für mich etwas verwirrend, möglicherweise kann jemand anderes es erweitern):

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

Hoffe das klärt es auf! Auch hier ist das Durchsuchen der Datei database.rake einfach und klärt alle anderen Fragen, die Sie möglicherweise haben. Dieser Link führt zu der Zeile, die der Anfang des :testNamespace ist.

Maurer
quelle
Fazit: Sie sind alle ziemlich gleich. :-p
Maurer
Warnung - Ich habe festgestellt, dass db: test: clone die Nullbarkeit von Spalten aus meiner Entwicklungsdatenbank nicht korrekt kopiert hat. Dies kann ein alter Fehler sein, der später behoben wurde, da ich ihn mit Rails 2.3.12 gefunden habe.
Jan Hettich
22

Sie sind eigentlich nicht ganz dasselbe. Alle Aufgaben, die das Wort "Schema" enthalten, wirken sich auf die Datei ... / db / schema.rb aus. schema.rb ist effektiv der Status Ihres Schemas, nachdem alle Migrationen angewendet wurden. Es kann ausgeführt werden, um Ihr Schema wiederherzustellen, anstatt alle Datenbankmigrationen auszuführen (was bei vielen Migrationen lange dauern kann).

Alle Aufgaben mit dem Wort 'Struktur' wirken sich auf die Datei {Rails.env} _structure.sql aus. Diese Datei wird verwendet, wenn Ihr Schema Konstrukte enthält, die nicht in der Datei schema.rb ausgedrückt werden können. Zum Beispiel, wenn Sie Funktionen verwenden, die für ein bestimmtes RDBMS spezifisch sind. Im Hintergrund erstellt Rails diese Datei mit dem für Ihr RDBMS geeigneten Schema-Dump-Dienstprogramm. Um das Schema wiederherzustellen, liest es die Datei ein und führt die SQL-Anweisungen erneut mit einem RDBMS-spezifischen Tool aus.

Rails weiß, ob die Route schema.rb oder die Route struct.sql verwendet werden soll, je nachdem, ob Sie sie festgelegt haben oder nicht

config.active_record.schema_format =: sql

in Ihrer ... / config / application.rb

brian
quelle
Beispiele für Dinge, die sich unterscheiden können: Trigger, Funktionen und gespeicherte Prozeduren. (weshalb wir immer noch mit Struktur stecken).
Taryn East