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


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


Db:migrate运行(单个)尚未运行的迁移。 Db:create创建数据库 Db:drop删除数据库 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 creates the database for the current env db:create:all creates the databases for all envs db:drop drops the database for the current env db:drop:all drops the databases for all envs db:migrate runs migrations for the current env that have not run yet db:migrate:up runs one specific migration db:migrate:down rolls back one specific migration db:migrate:status shows current migration status db:rollback rolls back the last migration db:forward advances the current schema version to the next one db:seed (only) runs the db/seed.rb file db:schema:load loads the schema into the current env's database db:schema:dump dumps the current env's schema (and seems to create the db as well) db:setup runs db:create db:schema:load db:seed db:reset runs db:drop db:setup db:migrate:redo runs (db:migrate:down db:migrate:up) or (db:rollback db:migrate) depending on the specified migration db:migrate:reset runs 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)。


您可以简单地查看活动记录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

Use

如果你想改变模式 如果你想删除数据库,从schema重新加载schema。Rb,并重新播种数据库 rake db:schema:load如果你想将数据库重置为schema中提供的模式。rb(这将删除所有数据)

解释

load将按照schema中提供的方式设置模式。rb文件。这对于新安装的应用程序很有用,因为它不需要像db:migrate那样多的时间

重要提示,db:schema:load将删除服务器上的数据。

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

Rake db:migrate提供了up、down等任务,支持Rake db:rollback等命令,使其成为最有用的命令。

Rake db:reset执行db:drop和db:setup 它删除数据库,重新创建数据库,加载模式,并使用种子数据进行初始化

database .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:migrate:down、db:migrate:up或db:migrate:rollback、db:migrate:up。

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:load根据模式重新创建数据库。rb文件。删除已有数据。

db:schema:dump dump当前环境的模式到db/schema.rb。

db:structure:load -从结构中重新创建数据库。sql文件。

db:structure:dump -将当前环境的架构转储到db/structure.sql。 (你可以用SCHEMA=db/my_structure.sql指定另一个文件)

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: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或db:schema:load)时内部使用。


列出所有任务

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

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

db:create
db:drop
...

总结

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

db:drop:删除存在的数据库。

db:environment:set:通过在内部表中设置当前环境,修复在模式中没有找到环境数据时引发的EnvironmentMismatchError或NoEnvironmentInSchemaError。

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:drop, db:create, db:migrate任务来做到这一点。

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

db:schema:cache:clear:清除db/schema_cache。db:schema:cache:dump任务生成的Yml文件。

db:schema:cache:dump:创建db/schema_cache。yml文件。

db:schema:dump:创建数据库模式文件(db/schema. dump中任意一个)。Rb或db/结构。Sql,取决于config.active_record.schema_format)。

db:schema:load:加载数据库模式文件(db/schema. xml文件中的任意一个)。Rb或db/结构。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:结构:转储:弃用。是用来倾倒建筑物的。sql文件。 db:结构:负载:弃用。它是用来装载结构的。sql文件。

要了解为什么这些任务被弃用的一些历史,请查看这个wtf。不,我是认真的。

运行rails新生成器而不指定数据库设置您的应用程序与sqlite。以后更改数据库很麻烦。这个任务可以帮助你通过委托给rails db:change SYSTEM=postgresql|mysql|whatever生成器来轻松更改数据库。

db:version:打印当前模式版本号。

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