rake db:migrate db:reset和db:schema:load之间的区别


619

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)新鲜的数据库和运行迁移。

如果我的理解有误,请帮助澄清。


10
rake --tasks帮助吗?
zx1986


您的理解rake db:migrate是正确的,但您的理解rake db:reset是错误的。请参阅莫里兹的最高答案。
Magne

1
顺便说一句,作为导轨5的,这些命令可以作为调用rails db:migraterails db:resetrails db:schema:load。参见stackoverflow.com/questions/38403533/…–
Purplejacket

Answers:


1303
  • 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:reset会执行db:drop,db:create,db:migrate

通常,在通过新的迁移文件对模式进行更改之后,您将使用db:migrate(仅当数据库中已有数据时才有意义)。设置应用程序的新实例时,将使用db:schema:load。

希望对您有所帮助。


Rails 3.2.12的更新:

我刚刚检查了源,现在的依赖项是这样的:

  • db:create为当前环境创建数据库
  • db:create:all为所有环境创建数据库
  • db:drop删除当前环境的数据库
  • db:drop:all删除所有环境的数据库
  • db:migrate为当前环境运行尚未运行的迁移
  • db:migrate:up运行一次特定的迁移
  • db:migrate:down回滚一个特定的迁移
  • db:migrate:status显示当前迁移状态
  • db:rollback回滚上一次迁移
  • db:forward将当前模式版本升级到下一个版本
  • db:seed(仅)运行db / seed.rb文件
  • db:schema:load将模式加载到当前环境的数据库中
  • db:schema:dump转储当前环境的模式(并且似乎也创建了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)



3
@cutation:db:setup肯定不会运行db:migrate,因为仅针对db设置运行所有迁移将非常脆弱(这是schema.rb的目的)。
moritz

2
我正在执行db:reset,它正在播种我的数据库。为什么会这样呢?
亚历杭德罗·里德尔

db:setup也会在db:create必要时运行。至少从rails 4.0.2开始。
2014年

如果有挂起的迁移,Rails 4将rake db:migrate在调用时执行,rake db:setup但不会执行挂起的迁移。
Pooyan Khosravi 2014年

24

TLDR

采用

  • 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提供任务等使诸如rake db:rollback并使其成为最有用的命令。

rake db:reset做一个db:dropdb:setup
它植入数据库,重新创建,加载模式,并初始化种子数据

来自database.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:load(通过一系列先前的迁移创建)来创建生产模式,您将不知道哪些迁移(参与创建初始schema.rb的那些迁移)将在以后运行db:migrate的调用?
CanadaIT '17

2

据我了解,它将删除您的数据库并根据您的db/schema.rb文件重新创建它。因此,您需要确保schema.rb文件始终是最新的并且受版本控制。


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方面做得非常好,因此它们并不总是能很好地记录代码。如果我们知道该怎么做,我们都可以为您提供帮助。


如果文章被删除,请引用文章的相关部分。不要建议做一些不解释原因的事情。
PhilT

0

已针对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:updb:migrate:rollbackdb:migrate:up根据指定的迁移,。

db:migrate:up -为指定的迁移版本运行。

db:migrate:down -为给定的迁移版本(VERSION)运行失败。

db:migrate:status -显示当前的迁移状态。

db:migrate:rollback -回滚上一次迁移。

db:version -打印当前架构版本。

db:forward -将架构推送到下一个版本。

db:seed-运行db / seeds.rb文件。

db:schema:loadschema.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:createdb:schema:loaddb:seed

db:reset运行db:dropdb:setupdb:migrate:reset-运行db:dropdb:createdb: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:dropdb:schema:load)时在内部使用。

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.