db:test:clone,db:test:clone_structure,db:test:load,db:test:prepare?有什么区别?
你不得不承认,对于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有什么区别?
这些任务有多相似(或不同)?
很好的问题。 难道我难住,所以我插入轨道源并拉起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
,但是在testing数据库上调用它:
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: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命名空间开始的那一行。
他们实际上不是完全一样的东西。 任何包含单词“schema”的任务都会作用于… / db / schema.rb文件。 在应用所有迁移之后,schema.rb实际上是您的模式的状态。 它可以被执行来恢复你的模式,而不是运行所有数据库迁移(如果你有很多的迁移可能需要很长时间)。
任何带有“结构”一词的任务,都会在{Rails.env} _structure.sql文件中执行。 当您的模式包含无法在schema.rb文件中表示的结构时使用此文件。 例如,如果您使用特定于特定RDBMS的function。 在封面下,rails使用适合您的RDBMS的任何模式转储实用程序生成此文件。 为了恢复模式,它使用特定于RDBMS的工具读入文件并重新执行SQL语句。
Rails知道是否根据你是否设置了schema.rb路由或者structure.sql路由
config.active_record.schema_format =:sql
在你的… / config / application.rb中