Ruby on rails rake db:migrate db:reset和db:schema:load之间的差异

Ruby on rails rake db:migrate db:reset和db:schema:load之间的差异,ruby-on-rails,ruby,database,rake,Ruby On Rails,Ruby,Database,Rake,在我的脑海中,rakedb:migrate和rakedb:reset之间的区别非常清楚。我不明白的是,rakedb:schema:load与前两者有什么不同 为了确保我的观点一致: rake db:migrate-运行尚未运行的迁移 rake db:reset-清除数据库(可能执行rake db:drop+rake db:create+rake db:migrate)并在新数据库上运行迁移 如果我的理解有误,请帮助澄清。据我所知,它将删除您的数据库,并根据您的db/schema.rb文件重新

在我的脑海中,
rakedb:migrate
rakedb:reset
之间的区别非常清楚。我不明白的是,
rakedb:schema:load
与前两者有什么不同

为了确保我的观点一致:

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

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

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

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

  • db:create创建数据库

  • db:drop删除数据库

  • db:schema:load根据schema.rb在现有数据库中创建表和列。这将删除现有数据

  • db:setupdb:create、db:schema:load、db:seed

  • db:resetdb:drop、db:setup

  • db:migrate:resetdb: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: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


有关更多信息,请查看(适用于Rails 3.2.x)和(适用于Rails 4.0.x)

您可以简单地查看Active Record Rake任务,因为我认为它们位于此文件中。

他们做什么是你的问题对吗

这取决于它们来自何处,这只是一个例子,表明它们因任务而异。这里我们有一个不同的文件,其中充满了任务

它有这些任务

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
删除服务器上的数据

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

rake-db:migrate
提供任务等,它支持像
rake-db:rollback
这样的命令,使之成为最有用的命令

rake db:reset
执行
db:drop
db:setup

它删除数据库,再次创建它,加载模式,并使用种子数据进行初始化

来自的命令的相关部分


轨道5
db:create
-为当前的RAILS\n创建数据库
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