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


74

对于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

我什至不知道结构和架构之间的区别。加载当前环境的架构和仅加载schema.rb有什么区别?

这些任务到底有多相似(或不同)?

Answers:


69

很好的问题。如果我绊倒了,我便钻进了铁轨源头,拉起来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: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
砖匠2011年

警告-我发现db:test:clone没有正确地从开发数据库中复制列的可空性。这可能是一个较旧的错误,后来已修复,因为我使用Rails 2.3.12发现了它。
1

22

它们实际上不是一回事。任何包含单词“ 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中


可能不同的示例:触发器,函数和存储过程。(这就是为什么我们仍然使用结构的原因)。
塔林东区2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.