В чем разница между db: test: clone, db: test: clone_structure, db: test: load и db: test: prepare? - PullRequest
70 голосов
/ 08 октября 2011

Для новичка в рельсах и базах данных вы должны признать, что официальное объяснение на 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

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

Насколько похожи (или различны) эти задачи?

Ответы [ 2 ]

64 голосов
/ 08 октября 2011

Очень хороший вопрос.Если бы я был в тупике, я нырнул в источник рельсов и поднял 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}_structure.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}_structure.sql) или db:test:load (с использованием файла schema.rb), в зависимости отформат схемы (это немного смущает меня, может быть, кто-то еще может расширить его):

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

Надеюсь, это прояснит это!Опять же, просмотр файла database.rake прост и прояснит любые другие вопросы, которые могут у вас возникнуть.Эта ссылка ведет на строку, которая является началом пространства имен :test.

21 голосов
/ 06 апреля 2012

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

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

Rails знает, идти ли по пути schema.rb или по маршруту Structure.sql, в зависимости от того, стоит ливы установили

config.active_record.schema_format =: sql

в вашем ... / config / application.rb

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...