提问



rake db:migraterake db:reset之间的区别在我脑海中非常明显。我不明白的是rake db:schema:load与前两者有何不同。


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



  • rake db:migrate - 运行尚未运行的迁移。

  • rake db:reset - 清除数据库(可能是rake db:drop + rake db:create + rake db:migrate并在新数据库上运行迁移。



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

最佳参考



  • 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 为所有envs
  • 创建数据库
  • 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 (仅)运行db/seed.rb文件

  • db:schema:load 将架构加载到当前环境的数据库中

  • 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)[34] [35]

其它参考1


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知道哪个文件是最旧的filename db:migrate带来的好处是数据也可以放在数据库中。这实际上不是一个好习惯。最好用rake db:seed来添加数据。


rake db:migrate提供向上,向下等任务,启用rake db:rollback之类的命令,并使其成为最有用的命令。 [36] [37]


rake db:resetdb: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

其它参考2


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

其它参考3


您可以简单地查看Active Record Rake任务,因为我认为它们就像在此文件中一样。
https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/lib/active_record/tasks/database_tasks.rb[39]


他们做的是你的问题对吗?


这取决于它们来自何处,这只是表明它们根据任务而变化的例子。在这里,我们有一个完整的任务文件。


https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/Rakefile[40]


有这些任务。


namespace :db do
  task create: ["db:mysql:build", "db:postgresql:build"]
  task drop: ["db:mysql:drop", "db:postgresql:drop"]
end


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