Какая разница между дБ:тест:клон, дБ:тест:структура клон, дБ:тест:нагрузки, дБ:тест:подготовить?
вам придется признать, новичку в 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 ответа:
очень хороший вопрос. Я был в тупике, поэтому я нырнул в источник рельсов и вытащил
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.РБ