rake db:迁移db:重置和db:模式:加载之间的区别

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

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

  • rake db:migrate-运行尚未运行的迁移。
  • rake db:reset-清除数据库(大概执行rake db:drop+rake db:create+rake db:migrate)并在新数据库上运行迁移。
415185 次浏览

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

  • db:迁移运行尚未运行的(单个)迁移。

  • db:创建创建数据库

  • db: drop删除数据库

  • 数据库:架构:加载在现有数据库中创建表和列schema.rb.这将删除存量数据。

  • db:安装执行db: create, db: Schema: load, db:种子操作

  • db:重置执行db: drop, db: setp操作

  • db:迁移:重置执行db: Drop, db: Create, db:迁移

通常,在通过新的迁移文件对架构进行更改后,您将使用db:迁移(这仅在数据库中已经有数据的情况下才有意义)。当您设置应用程序的新实例时,将使用db:模式:负载。


对于rails 3.2.12:

我刚刚检查了源代码,依赖关系现在是这样的:

  • db:创建为当前环境创建数据库

  • 数据库:创建:全部为所有环境创建数据库

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

  • db: drop: all//删除删除所有环境的数据库

  • db:迁移运行尚未运行的当前环境的迁移

  • 数据库:迁移:向上运行一个特定的迁移

  • 数据库:迁移:向下回滚一个特定的迁移

  • 数据库:迁移状态显示当前迁移状态

  • db:回滚回滚最后一次迁移

  • db:转发将当前模式版本前进到下一个版本

  • db:种子(仅限)运行db/seed.rb文件

  • 数据库:架构:加载将模式加载到当前env的数据库中

  • 数据库:架构:转储转储当前env的模式(并且似乎也创建了数据库)

  • db:安装运行db: createdb:从业人员:加载db:种子

  • db:重置运行数据库:删除数据库:设置

  • 数据库:迁移:重做根据指定的迁移运行(db:迁移:向下db:迁移:向上)或(db:回滚db:迁移)

  • db:迁移:重置运行数据库:删除数据库:创建数据库:迁移

有关更多信息,请查看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)

您可以简单地查看活动记录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方面做得很好,因此它们并不总是很好地记录代码。如果我们知道它应该做什么,我们都可以提供帮助。

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
它删除数据库,再次创建它,加载模式,并使用种子数据初始化

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

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:迁移:回滚数据库:迁移:向上

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

db:migrate:down-运行给定迁移版本的down。

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:创建数据库:架构:加载db:种子

db:reset运行db: dropdb:安装db:migrate:reset-运行db: dropdb:创建db:迁移

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数据库:架构:加载

列出所有任务

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

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


db:create
db:drop
...

总结

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

db: drop:如果数据库存在,则删除它。

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

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

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

数据库:迁移:向下:通过运行down方法来恢复上次迁移的up方法执行的转换。

数据库:迁移:重做:回滚数据库一次迁移并向上重新迁移。

数据库:迁移状态:显示迁移的状态。

数据库:迁移:向上:为给定的迁移运行up方法。

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

db:重置:使用当前环境的迁移重置数据库。它通过运行db:dropdb:createdb:migrate任务来做到这一点。

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

数据库:架构:缓存:清除:清除由db:schema:cache:dump任务生成的db/schema_cache.yml文件。

数据库:架构:缓存:转储:创建一个db/schema_cache.yml文件。

数据库:架构:转储:创建数据库模式文件(db/schema.rbdb/structure.sql,具体取决于config.active_record.schema_format)。

数据库:架构:加载:将数据库模式文件(db/schema.rbdb/structure.sql,取决于config.active_record.schema_format)加载到数据库中。

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

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

db:安装:创建所有数据库db:create,加载所有模式db:schema:load,并使用种子数据db:seed进行初始化。但是,如果数据库存在,它不会首先删除。使用db:reset也首先删除所有数据库。

数据库:结构:转储:已弃用。它用于转储structure.sql文件。 数据库:结构:加载:已弃用。它用于加载structure.sql文件。

有关这些任务被弃用的一些历史,请查看此wtf。不,认真

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

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

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