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
4 回答
db:migrate 运行尚未运行的(单个)迁移 .
db:create 创建数据库
db:drop 删除数据库
db:schema:load 在schema.rb之后的(现有)数据库中创建表和列
db:setup 确实db:create,db:schema:load,db:seed
db:reset 执行db:drop,db:setup
通常,在通过新的迁移文件对架构进行更改后,您将使用db:migrate(仅当数据库中已存在数据时才有意义) . db:schema:在设置应用程序的新实例时使用load .
我希望有所帮助 .
更新rails 3.2.12:
我刚检查了源代码,依赖关系现在是这样的:
db:create 为当前环境创建数据库
db:create:all 为所有env创建数据库
db:drop 删除当前环境的数据库
db:drop:all 删除所有env的数据库
db:migrate 为尚未运行的当前env运行迁移
db:migrate:up 运行一个特定的迁移
db:migrate:down 回滚一个特定的迁移
db:migrate:status 显示当前的迁移状态
db:rollback 回滚上次迁移
db:forward 将当前架构版本推进到下一个版本
db:seed (仅)运行db / seed.rb文件
db:schema:load 将架构加载到当前的env数据库中
db:schema:dump 转储当前的env架构(并且似乎也创建了db)
db:setup 运行db:schema:load,db:seed
db:reset 运行db:drop db:setup
db:migrate:redo 运行(db:migrate:down db:migrate:up)或(db:rollback db:migrate),具体取决于指定的迁移
db:migrate:reset 运行db:drop db:create db:migrate
有关详细信息,请查看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
重新加载架构,然后重新设置数据库rake db:schema:load
如果您想将数据库重置为架构,如schema.rb
中所述(这将删除所有数据)解释
rake db:schema:load
将设置schema.rb
文件中提供的架构 . 这对于全新安装的应用程序很有用,因为它不需要花费太多时间db:migrate
rake db:migrate
对现有架构进行了更改 . 它就像创建架构版本一样 . 对于任何ruby文件,db:migrate
将在db/migrate/
中查找并执行从最旧的文件开始尚未运行的迁移 . 通过查看迁移文件名开头的时间戳,Rails知道哪个文件是最旧的 .db:migrate
带来的好处是数据也可以放在数据库中 . 这实际上不是一个好习惯 . 最好使用rake db:seed
来添加数据 .rake db:migrate
提供了up,down等任务,可以启用rake db:rollback
之类的命令,并使其成为最有用的命令 .rake db:reset
做db:drop
和db:setup
它删除数据库,再次创建它,加载模式,并使用种子数据进行初始化
来自databases.rake的相关命令部分
据我所知,它将删除您的数据库并根据您的
db/schema.rb
文件重新创建它 . 这就是为什么您需要确保schema.rb
文件始终是最新的并且受版本控制 .您可以简单地查看Active Record Rake任务,因为我认为它们就像在此文件中一样 . https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/lib/active_record/tasks/database_tasks.rb
他们做的是你的问题对吗?
这取决于它们来自何处,这只是表明它们根据任务而变化的例子 . 在这里,我们有一个完整的任务文件 .
https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/Rakefile
有这些任务 .
这可能无法解答您的问题,但可以让您深入了解并查看源代码,尤其是rake文件和任务 . 由于他们在帮助您使用rails方面做得非常好,因此他们并不总能很好地记录代码 . 如果我们知道它应该做什么,我们都可以帮助那里 .