db:test:clone,db:test:clone_structure,db:test:load和db:test:prepare有什么区别?

时间:2011-10-07 22:14:15

标签: ruby-on-rails database unit-testing

你必须承认,对于铁杆和数据库的新手,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 个答案:

答案 0 :(得分:64)

非常好的问题。让我难过,所以我潜入铁轨源并拉起database.rake。现在更清楚了:

  • db:test:clone只是db:schema:dumpdb: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:loaddb: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(使用{ {1}}文件),取决于架构格式(这对我来说有点混乱,也许其他人可以扩展它):

    schema.rb

希望这清除它!再次,浏览database.rake文件很容易,并且可以清除您可能遇到的任何其他问题。该链接将转到task :prepare => 'db:abort_if_pending_migrations' do # ... db_namespace[{ :sql => 'test:clone_structure', :ruby => 'test:load' }[ActiveRecord::Base.schema_format]].invoke end 命名空间的开头。

答案 1 :(得分:20)

它们实际上并不完全相同。任何包含“schema”一词的任务都会作用于... / db / schema.rb文件。 schema.rb实际上是应用所有迁移后的架构状态。可以执行它来恢复您的模式,而不是运行所有数据库迁移(如果您有大量迁移,这可能需要很长时间)。

任何带有“结构”一词的任务都会作用于{Rails.env} _structure.sql文件。当架构包含无法在schema.rb文件中表示的构造时,将使用此文件。例如,如果您使用特定于特定RDBMS的功能。在封面下,rails使用适合您的RDBMS的任何模式转储实用程序生成此文件。要恢复模式,它会读取文件并使用特定于RDBMS的工具再次执行SQL语句。

Rails知道是否要根据你是否设置

来使用schema.rb路由或structure.sql路由

config.active_record.schema_format =:sql

在你的... / config / application.rb