ruby rake db:migrate db:reset和db:schema:load的区别

uwopmtnx  于 12个月前  发布在  Ruby
关注(0)|答案(6)|浏览(95)

rake db:migraterake db:reset的区别很明显。我不明白的是rake db:schema:load和前两个有什么不同。
只是为了确保我在同一页上:

  • rake db:migrate-检查尚未运行的迁移。
  • rake db:reset-清除数据库(可能执行rake db:drop + rake db:create + rake db:migrate)并在新数据库上运行迁移。
hmae6n7t

hmae6n7t1#

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

w9apscun

w9apscun2#

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对现有架构进行更改。这就像创建schema的版本。db:migrate将在db/migrate/中查找任何ruby文件,并从最旧的文件开始执行尚未运行的迁移。Rails通过查看迁移文件名开头的时间戳来知道哪个文件是最旧的。db:migrate的好处是数据也可以放在数据库中。这实际上不是一个好的做法。最好使用rake db:seed来添加数据。
rake db:migrate提供了任务up,down等,这使得像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
pgpifvop

pgpifvop3#

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:downdb:migrate:updb:migrate:rollbackdb:migrate:up,具体取决于指定的迁移。
db:migrate:up-为给定的迁移版本重新配置。
db:migrate: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: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)时使用。

fhity93d

fhity93d4#

列出所有任务

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

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

db:create
db:drop
...

总结

db:create:创建数据库,除非它已经存在。
db:drop:删除数据库(如果存在)。
db:environment:set:通过在内部表中设置当前环境,修复了在架构中找不到环境数据时引发的EnvironmentMismatchErrorNoEnvironmentInSchemaError
db:fixtures:load:它加载fixture,即您想要测试的样本数据。它们存储在test/fixtures/目录下的YAML文件中。
db:migrate:为当前环境检查所有尚未运行的迁移。
db:migrate:down:通过运行down方法恢复上次迁移的up方法执行的转换。
db:migrate:redo:回滚数据库一次迁移并重新向上迁移。
db:migrate:status:显示迁移的状态。
db:migrate:up:为给定的迁移调用up方法。
db:prepare:如果数据库不存在,则返回setup。否则,它将运行迁移。
db:reset:使用当前环境的迁移重置数据库。它通过运行db:dropdb:createdb:migrate任务来实现这一点。
db:rollback:将架构回滚到以前的版本,撤消刚刚运行的迁移。如果要撤消以前的n迁移,请将STEP=n传递到此任务。
db:schema:cache:clear:清除db:schema:cache:dump任务生成的db/schema_cache.yml文件。
db:schema:cache:dump:创建db/schema_cache.yml文件。
db:schema:dump:创建数据库架构文件(db/schema.rbdb/structure.sql,具体取决于config.active_record.schema_format)。
db:schema:load:将数据库架构文件(db/schema.rbdb/structure.sql,具体取决于config.active_record.schema_format)加载到数据库中。
db:seed:从db/seeds.rb文件加载种子数据。
db:seed:replant:为当前环境截断每个数据库的表并加载种子
db:setup:创建所有数据库db:create,加载所有模式db:schema:load,并使用种子数据db:seed重新命名。但是,如果数据库存在,它不会首先删除数据库。使用db:reset也首先删除所有数据库。
db:structure:dump:不受欢迎。它被用来转储structure.sql文件。db:structure:load:不受欢迎。它用于加载structure.sql文件。

有关这些任务被弃用的原因,请查看wtf。不,seriously

db:system:change:在不指定数据库的情况下运行rails new生成器会将您的应用设置为sqlite。稍后更改数据库是一件麻烦事。此任务可帮助您通过委托rails db:change SYSTEM=postgresql|mysql|whatever生成器轻松更改数据库。
db:version:打印当前架构版本号。

来源:All the Database Tasks in Rails

zbwhf8kr

zbwhf8kr5#

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

wz1wpwve

wz1wpwve6#

你可以简单地看看活动记录耙任务,因为这是我相信他们生活在这个文件。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方面做得很好,但他们并不总是很好地记录代码。如果我们知道它应该做什么,我们都可以帮助它。

相关问题