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

Gau*_*wal 593 ruby database rake ruby-on-rails

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)并在新数据库上运行迁移.

如果我的理解出错了,请帮助澄清一下.

mor*_*itz 1254

  • 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(仅当数据库中已存在数据时才有意义).db:schema:在设置应用程序的新实例时使用load.

我希望有所帮助.


更新rails 3.2.12:

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

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

  • 这是带答案的文件:) - https://github.com/rails/rails/blob/master/activerecord/lib/active_record/railties/databases.rake (16认同)
  • @cutation:db:setup确实没有运行db:migrate,因为仅仅为db设置运行所有迁移太脆弱了(这就是schema.rb的用途). (3认同)
  • 我正在执行db:reset,它正在播放我的数据库.为什么会这样? (2认同)

sud*_*ang 22

TLDR

使用

  • rake db:migrate 如果您想对架构进行更改
  • rake db:reset如果要删除数据库,请从中重新加载模式schema.rb,然后重新设置数据库
  • rake db:schema:load如果您想将数据库重置为架构,如下所示schema.rb(这将删除所有数据)

说明

rake db:schema:load将设置schema.rb文件中提供的架构.这对于全新安装app非常有用,因为它不需要花费太多时间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做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
Run Code Online (Sandbox Code Playgroud)
  # desc 'Drops and recreates the database from db/schema.rb for the current environment and loads the seeds.'
  task :reset => [ 'db:drop', 'db:setup' ]
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)


小智 14

轨道5

\n

db:create- 为当前RAILS_ENV环境创建数据库。如果未指定RAILS_ENV,则默认为开发和测试数据库。

\n

db:create:all- 为所有环境创建数据库。

\n

db:drop- 删除当前RAILS_ENV环境的数据库。如果未指定RAILS_ENV,则默认为开发和测试数据库。

\n

db:drop:all- 删除所有环境的数据库。

\n

db:migrate- 为当前环境运行尚未运行的迁移。默认情况下,它将仅在开发环境中运行迁移。

\n

db:migrate:redo-根据指定的迁移运行db:migrate:downdb:migrate:updb:migrate:rollbackdb:migrate:up 。

\n

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

\n

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

\n

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

\n

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

\n

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

\n

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

\n

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

\n

db:schema:load从schema.rb文件重新创建数据库。删除现有数据。

\n

db:schema:dump将当前环境\xe2\x80\x99s 架构转储到db/schema.rb

\n

db:structure:load- 从Structure.sql文件重新创建数据库。

\n

db:structure:dump- 将当前环境\xe2\x80\x99s schema 转储到db/struct.sql。\n(您可以使用 指定另一个文件SCHEMA=db/my_structure.sql)

\n

db:setup运行db:createdb:schema:loaddb:seed

\n

db:reset运行db:dropdb:setup。\n db:migrate:reset- 运行db:dropdb:createdb:migrate

\n

db:test:prepare- 检查挂起的迁移并加载测试模式。(如果你运行 rake 时不带任何参数,它会默认执行此操作。)

\n

db:test:clone- 从当前环境\xe2\x80\x99s 数据库架构重新创建测试数据库。

\n

db:test:clone_structure- 与db:test:clone类似,但它将确保您的测试数据库与当前环境\xe2\x80\x99s 数据库具有相同的结构,包括字符集和排序规则。

\n

db:environment:set-在ar_internal_metadata表中设置当前的RAILS_ENV环境。(用作受保护环境检查的一部分。)

\n

db:check_protected_environments- 检查是否可以在当前RAILS_ENV环境中执行破坏性操作。在运行db:dropdb:schema:load 等破坏性操作时在内部使用。

\n