rake db之间的区别:migrate db:reset和db:schema:load
rake db:migrate
和rake db:reset
之间的区别在我的脑海中非常清晰。 我不明白的是rake db:schema:load
与前两者不同。
只要确定我在同一页面上:
rake db:migrate
- 运行尚未运行的迁移。 rake db:reset
- 清除数据库(大概做一个rake db:drop
+ rake db:create
+ rake db:migrate
)并在新数据库上运行迁移。 如果我的理解出错,请帮助澄清。
db:schema:load在schema.rb之后的(现有)数据库中创建表和列
db:setup does db:create,db:schema:load,db:seed
通常,在通过新的迁移文件对模式进行更改后,您将使用db:migrate(只有在数据库中已有数据时才有意义)。 db:schema:当您设置应用程序的新实例时使用load。
我希望有所帮助。
UPDATE for rails 3.2.12:
我刚刚检查了源代码,现在依赖关系如下所示:
db:schema:dump转储当前env的模式(并且似乎也创建了db)
db:setup运行db:schema:load,db:seed
有关更多信息,请查看https://github.com/rails/rails/blob/v3.2.12/activerecord/lib/active_record/railties/databases.rake(适用于Rails 3.2.x)和https:// github .com / rails / rails / blob / v4.0.5 / activerecord / lib / active_record / railties / databases.rake(用于Rails 4.0.x)
TLDR
使用
rake db:migrate
如果你想修改模式 rake db:reset
如果要删除数据库,请从schema.rb
重新加载模式,并重新设置数据库的schema.rb
rake db:schema:load
如果您想将数据库重置为schema.rb
提供的模式(这将删除所有数据) 说明
rake db:schema:load
将设置schema.rb
文件中提供的模式。 这对全新安装的应用程序非常有用,因为它不会像db:migrate
那样花费太多时间
重要说明, db:schema:load
会删除服务器上的数据。
rake db:migrate
对现有模式进行更改。 它就像创建模式版本一样。 db:migrate
将在db/migrate/
查找任何ruby文件,并执行从最旧的开始没有运行的迁移。 通过查看迁移文件名开头的时间戳,Rails知道哪个文件最早。 db:migrate
带来的好处是数据也可以放入数据库中。 这实际上不是一个好的做法。 最好使用rake db:seed
来添加数据。
rake db:migrate
提供了任务向上,向下等,这使rake db:rollback
等命令成为最有用的命令。
rake db:reset
执行db:drop
和db:setup
它删除数据库,再次创建它,加载模式,并使用种子数据进行初始化
来自databases.rake的命令的相关部分
namespace :schema do
desc 'Creates a db/schema.rb file that is portable against any DB supported by Active Record'
task :dump => [:environment, :load_config] do
require 'active_record/schema_dumper'
filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema.rb')
File.open(filename, "w:utf-8") do |file|
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
end
db_namespace['schema:dump'].reenable
end
desc 'Loads a schema.rb file into the database'
task :load => [:environment, :load_config, :check_protected_environments] do
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV['SCHEMA'])
end
# desc 'Drops and recreates the database from db/schema.rb for the current environment and loads the seeds.'
task :reset => [ 'db:drop', 'db:setup' ]
namespace :migrate do
# desc 'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
task :redo => [:environment, :load_config] do
if ENV['VERSION']
db_namespace['migrate:down'].invoke
db_namespace['migrate:up'].invoke
else
db_namespace['rollback'].invoke
db_namespace['migrate'].invoke
end
end
据我了解,它将删除您的数据库,并根据您的db/schema.rb
文件重新创建它。 这就是为什么你需要确保你的schema.rb
文件始终是最新的版本控制。
上一篇: Difference between rake db:migrate db:reset and db:schema:load