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
)并在新数据库上运行迁移。如果我的理解出错,请帮助澄清。
答案 0 :(得分:1222)
db:schema:load 在schema.rb之后的(现有)数据库中创建表和列
db:setup 执行db:create,db:schema:load,db:seed
通常,在通过新的迁移文件对架构进行更改后,您将使用db:migrate(仅当数据库中已存在数据时才有意义)。 db:schema:在设置应用程序的新实例时使用load。
我希望有所帮助。
更新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)
答案 1 :(得分:21)
使用
rake db:migrate
如果您想对架构进行更改rake db:reset
如果您想删除数据库,请从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
提供了up,down等任务,可以启用rake db:rollback
之类的命令,并使其成为最有用的命令。
rake db:reset
执行db:drop
和db:setup
它删除数据库,再次创建它,加载模式,并使用种子数据初始化
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
答案 2 :(得分:2)
据我了解,它将删除您的数据库并根据您的db/schema.rb
文件重新创建它。这就是为什么您需要确保schema.rb
文件始终是最新的并且受版本控制。
答案 3 :(得分:1)
Rails 5更新:
db:create
-为当前 RAILS_ENV 环境创建数据库。如果未指定 RAILS_ENV ,则默认为开发和测试数据库。
db:create:all
-为所有环境创建数据库。
db:drop
-删除当前 RAILS_ENV 环境的数据库。如果未指定 RAILS_ENV ,则默认为开发和测试数据库。
db:drop:all
-删除所有环境的数据库。
db:migrate
-为当前环境运行尚未运行的迁移。默认情况下,它将仅在开发环境中运行迁移。
db:migrate:redo
-运行 db:migrate:down 和 db:migrate:up 或 db:migrate:rollback 和< strong> db:migrate:up 取决于指定的迁移。
db:migrate:up
-为给定的迁移版本VERSION。
db:migrate:down
-为给定的迁移版本VERSION运行。
db:migrate:status
-显示当前的迁移状态。
db:migrate:rollback
-回滚上一次迁移。
db:version
-打印当前架构版本。
db:forward
-将架构推送到下一个版本。
db:seed
-运行 db / seeds.rb 文件。
db:schema:load
从 schema.rb 文件重新创建数据库。
db:schema:dump
将当前环境的模式转储到 db / schema.rb 。
db:structure:load
-从 structure.sql 文件重新创建数据库。
db:structure:dump
-将当前环境的架构转储到 db / structure.sql 。
(您可以使用SCHEMA=db/my_structure.sql
指定另一个文件)
db:setup
运行 db:create , db:schema:load 和 db:seed 。
db:reset
运行 db:drop 和 db:setup 。
db:migrate:reset
-运行 db:drop , db:create 和 db:migrate 。
db:test:prepare
-检查是否有挂起的迁移并加载测试架构。 (如果您在不使用任何参数的情况下运行rake,则默认情况下将执行此操作。)
db:test:clone
-根据当前环境的数据库架构重新创建测试数据库。
db:test:clone_structure
-与 db:test:clone 类似,但是它将确保您的测试数据库与当前环境的数据库具有相同的结构,包括字符集和排序规则。>
db:environment:set
-在 ar_internal_metadata 表中设置当前的 RAILS_ENV 环境。 (用作保护环境检查的一部分。)
db:check_protected_environments
-检查是否可以在当前 RAILS_ENV 环境中执行破坏性操作。在运行破坏性操作(例如 db:drop 或 db:schema:load )时在内部使用。
答案 4 :(得分:0)
您可以简单地查看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
有这些任务。
namespace :db do
task create: ["db:mysql:build", "db:postgresql:build"]
task drop: ["db:mysql:drop", "db:postgresql:drop"]
end
这可能无法解答您的问题,但可以让您深入了解并查看源代码,尤其是rake文件和任务。由于他们在帮助您使用rails方面做得非常好,因此并不总能很好地记录代码。如果我们知道它应该做什么,我们都可以帮助那里。