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

Difference between rake db:migrate db:reset and db:schema:load

提问人:Gaurav Agarwal 提问时间:4/25/2012 最后编辑:NoDataDumpNoContributionGaurav Agarwal 更新时间:8/25/2023 访问量:432440

问:

和之间的区别对我来说非常清楚。我不明白的是与前两者有何不同。rake db:migraterake db:resetrake db:schema:load

只是为了确保我在同一页面上:

  • rake db:migrate- 运行尚未运行的迁移。
  • rake db:reset- 清除数据库(大概是 + + )并在新数据库上运行迁移。rake db:droprake db:createrake db:migrate
Ruby-on-Rails Ruby 数据库 耙子

评论

13赞 zx1986 11/28/2014
有帮助吗?rake --tasks
0赞 Bishisht Bhatta 5/3/2016
你应该看看这个博客。jacopretorius.net/2014/02/......
0赞 Magne 6/8/2017
你的理解是正确的,但你的理解是错误的。请看莫里茨的最上面的答案。rake db:migraterake db:reset
2赞 Purplejacket 9/11/2019
顺便说一句,从 Rails 5 开始,这些命令可以作为 、 、 调用。查看 stackoverflow.com/questions/38403533/...rails db:migraterails db:resetrails db:schema:load

答:

2赞 Simon Bagreev 4/25/2012 #1

据我了解,它将删除您的数据库并根据您的文件重新创建它。这就是为什么你需要确保你的文件始终是最新的,并处于版本控制之下。db/schema.rbschema.rb

1518赞 moritz 4/25/2012 #2
  • 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 为所有 env 创建数据库

  • db:drop 删除当前环境的数据库

  • db:drop:all 删除所有 env 的数据库

  • 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:setup 运行 db:create 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)

评论

23赞 cutalion 4/25/2012
这是带有答案的文件 :) - github.com/rails/rails/blob/master/activerecord/lib/...
3赞 moritz 4/25/2012
@cutation:db:setup 肯定不会运行 db:migrate,因为仅针对数据库设置运行所有迁移太脆弱了(这就是 schema.rb 的用途)。
2赞 Alejandro Riedel 2/11/2013
我正在执行db:reset,它正在播种我的数据库。为什么会这样?
1赞 Dan 2/14/2014
如有必要,DB:SETUP 也会运行。至少从 rails 4.0.2 开始。db:create
0赞 Pooyan Khosravi 10/31/2014
如果存在待处理的迁移,Rails 4 将在调用时执行,但不会执行待处理的迁移。rake db:migraterake db:setup
0赞 Douglas G. Allen 2/8/2015 #3

您可以简单地查看 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

这可能无法回答您的问题,但可以让您深入了解并继续查看源代码,尤其是耙子文件和任务。由于它们在帮助您使用 rails 方面做得很好,因此它们并不总是很好地记录代码。如果我们知道它应该做什么,我们都可以在那里提供帮助。

评论

0赞 PhilT 12/2/2016
请引用文章的相关部分,以防被删除。不要在不解释原因的情况下建议做某事。
27赞 sudo bangbang 4/7/2016 #4

顶级域名

  • rake db:migrate如果要对架构进行更改
  • rake db:reset如果要删除数据库,请从 重装架构,然后重新设定数据库的种子schema.rb
  • rake db:schema:load如果要将数据库重置为(这将删除所有数据)中提供的架构schema.rb

解释

rake db:schema:load将按照文件中提供的方式设置架构。这对于全新安装应用程序很有用,因为它不需要花费那么多时间schema.rbdb:migrate

重要提示,将删除服务器上的数据。db:schema:load

rake db:migrate对现有架构进行更改。这就像创建架构版本一样。 将查找任何 Ruby 文件,并从最旧的文件开始执行尚未运行的迁移。Rails 通过查看迁移文件名开头的时间戳来知道哪个文件是最早的。 还有一个好处,数据也可以放在数据库中。这实际上不是一个好的做法。最好用于添加数据。db:migratedb/migrate/db:migraterake db:seed

rake db:migrate提供向上向下等任务,使命令成为最有用的命令。rake db:rollback

rake db:reset执行 a 和
它删除数据库,再次创建它,加载架构,并使用种子数据进行初始化
db:dropdb: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

评论

0赞 2/16/2017
因此,如果您使用 db:schema:load(从一系列先前的迁移中创建)创建生产模式,那么 rake 会知道哪些迁移(参与创建初始 schema.rb 的迁移)不需要在将来调用 db:migrate 时运行吗?
13赞 Ivan Skotsyk 5/4/2020 #5

轨道 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 和 db:migrate:up

db:migrate:up- 为给定的迁移 VERSION 运行 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:create、db:schema:load 和 db:seed

db:reset运行 db:drop 和 db:setup。 - 运行 db:drop、db:create 和 db:migratedb:migrate:reset

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)时使用。

3赞 software_writer 12/9/2021 #6

列出所有任务

您可以通过从 Rails 应用程序目录运行以下命令来查找 Rails 提供的所有数据库任务。

➜  blog (main) ✗ bin/rails help | grep db:

db:create
db:drop
...

总结

db:create:创建数据库,除非它已存在。

db:drop:删除数据库(如果存在)。

db:environment:set:通过在内部表中设置当前环境,修复在架构中找不到环境数据时引发的 or。EnvironmentMismatchErrorNoEnvironmentInSchemaError

db:fixtures:load:它加载夹具,即要测试的示例数据。它们存储在目录下的 YAML 文件中。test/fixtures/

db:migrate:针对当前环境运行所有尚未运行的迁移。

db:migrate:down:通过运行上次迁移的方法还原该方法执行的转换。updown

db:migrate:redo:回滚一次迁移的数据库,然后重新迁移。

db:migrate:status:显示迁移状态。

db:migrate:up:运行给定迁移的方法。up

db:prepare:如果数据库不存在,则运行。否则,它将运行迁移。setup

db:reset:使用当前环境的迁移重置数据库。它通过运行 、 任务来实现此目的。db:dropdb:createdb:migrate

db:rollback:将架构回滚到以前的版本,撤消刚刚运行的迁移。如果要撤消以前的迁移,请传递到此任务。nSTEP=n

db:schema:cache:clear:清除任务生成的 db/schema_cache.yml 文件。db:schema:cache:dump

db:schema:cache:dump:创建数据库/schema_cache.yml文件。

db:schema:dump:创建数据库模式文件(或 ,取决于 )。db/schema.rbdb/structure.sqlconfig.active_record.schema_format

db:schema:load:将数据库模式文件(either 或 ,取决于 )加载到数据库中。db/schema.rbdb/structure.sqlconfig.active_record.schema_format

db:seed:从文件加载种子数据。db/seeds.rb

db:seed:replant:截断当前环境下每个数据库的表并加载种子

db:setup:创建所有数据库,加载所有模式,并使用种子数据进行初始化。但是,如果数据库存在,它不会首先删除数据库。还用于首先删除所有数据库。db:createdb:schema:loaddb:seeddb:reset

db:structure:dump:已弃用。它用于转储文件。db:structure:load:已弃用。它用于加载文件。structure.sqlstructure.sql

有关弃用这些任务的原因的一些历史记录,请查看此 wtf。不,说真的

db:system:change:在不指定数据库的情况下运行生成器会将应用设置为 。以后更改数据库很麻烦。此任务可帮助您通过委托给生成器来轻松更改数据库。rails newsqliterails db:change SYSTEM=postgresql|mysql|whatever

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

来源:Rails 中的所有数据库任务