Какая разница между дБ:тест:клон, дБ:тест:структура клон, дБ:тест:нагрузки, дБ:тест:подготовить?


вам придется признать, новичку в rails и базах данных, официальное объяснение на rubyonrails.org делает все четыре из этих задач звучат точно так же. Цитата:

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

Я даже не знаю разницы между структурой и схемой. И в чем разница между загрузкой схемы текущей среды и просто загрузкой схемы.РБ?

насколько похожи (или отличаются) эти задачи?

2 66

2 ответа:

очень хороший вопрос. Я был в тупике, поэтому я нырнул в источник рельсов и вытащил database.rake. Теперь все более ясно:

db:test:clone это просто комбинация db:schema:dump и db:test:load:

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

db:test:clone_structure использует структуру {rails_env}_.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 это то же самое, что db:schema:load, но вызывает его в тестовой базе данных:

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

db:test:prepare предупреждает вас, если какие-либо миграции находятся в ожидании, а если нет, либо работает db:test:clone_structure (используя структуру {rails_env}_.sql file) или db:test:load (используя схемы.rb file), в зависимости от формата схемы (это немного смущает меня, может быть, кто-то еще может расширить его):

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

надеюсь, что это очищает его! Опять же, проходя через

на самом деле это не совсем одно и то же. Любая из тех задач, которые содержат слово "схема", действуют на него .../db / schema.rb файл. схема.rb-это фактически состояние вашей схемы после применения всех миграций. Он может быть выполнен для восстановления схемы, а не для запуска всех миграций БД (что может занять много времени, если у вас много миграций).

любая из задач со словом 'структура', действует на {Rails.env}_структура.sql-файл. Этот файл используется, когда ваша схема содержит конструкции, которые не могут быть выражены в схеме.rb файл. Например, если вы используете функции, специфичные для конкретной СУБД. Под обложками rails создает этот файл, используя любую утилиту дампа схемы, подходящую для вашей СУБД. Чтобы восстановить схему, он считывает файл и выполняет инструкции SQL agains с помощью инструмента, специфичного для СУБД.

Rails знает, нужно ли идти по схеме.RB маршрут или структура.маршрут sql на основе того, есть ли у вас набор

config.активная запись.schema_format =: sql

в свой .../ config / application.РБ