Яка різниця між db: test: clone, db: test: clone_structure, db: test: load та db: test: priprem?


74

Потрібно визнати, що для новачків рейок та баз даних офіційне пояснення на 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?

Наскільки схожі (або різні) ці завдання?

Відповіді:


69

Дуже гарне запитання. Був мене тупиком, тому я занурився у джерело рейок і підтягнувся 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простору імен.


Підсумок: Усі вони майже однакові. :-p
брикер

попередження - я виявив, що db: test: clone неправильно скопіював дозволеність стовпців з моєї бази даних розробки. Це може бути стара помилка, яку згодом було виправлено, оскільки я знайшов її за допомогою Rails 2.3.12.
Ян Хеттіч,

22

Вони насправді не зовсім одне і те ж. Будь-яке із тих завдань, що містять слово "схема", діє на файл ... / 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


приклади речей, які можуть відрізнятися: тригери, функції та збережені процедури. (саме тому ми все ще застрягли за допомогою структури).
Тарін Іст
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.