[英]Difference between rake db:migrate db:reset and db:schema:load
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: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 用于设置应用程序的新实例。
我刚刚检查了源和依赖关系现在是这样的:
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: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)
利用
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 通过查看迁移文件名开头的时间戳来知道哪个文件最旧。 db:migrate
带来的好处是数据也可以放入数据库中。 这实际上不是一个好习惯。 最好使用rake db:seed
添加数据。
rake db:migrate
提供任务up 、 down等,它可以启用像rake db:rollback
这样的命令,并使其成为最有用的命令。
rake db:reset
执行db:drop
和db:setup
它删除数据库,再次创建它,加载模式,并使用种子数据进行初始化
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
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
- 为给定的迁移 VERSION 运行 up。
db:migrate:down
- 为给定的迁移 VERSION 运行 down。
db:migrate:status
- 显示当前迁移状态。
db:migrate:rollback
- 回滚上次迁移。
db:version
- 打印当前模式版本。
db:forward
- 将模式推送到下一个版本。
db:seed
- 运行db/seeds.rb文件。
db:schema:load
从schema.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: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 :它加载夹具,即您要测试的样本数据。 它们存储在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:dump
任务生成的 db/schema_cache.yml 文件。
db:schema:cache:dump :创建一个 db/schema_cache.yml 文件。
db:schema:dump :创建数据库模式文件( db/schema.rb
或db/structure.sql
,取决于config.active_record.schema_format
)。
db:schema:load :将数据库模式文件( db/schema.rb
或db/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
文件。
db:system:change :在不指定数据库的情况下运行rails new
generator 会使用sqlite
设置您的应用程序。 以后改数据库很麻烦。 此任务通过委托给rails db:change SYSTEM=postgresql|mysql|whatever
生成器来帮助您轻松更改数据库。
db:version :打印当前模式版本号。
资料来源: Rails 中的所有数据库任务
据我了解,它将删除您的数据库并根据您的db/schema.rb
文件重新创建它。 这就是为什么您需要确保您的schema.rb
文件始终是最新的并且处于版本控制之下的原因。
您可以简单地查看 Active Record 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 方面做得很好,他们并不总是能很好地记录代码。 如果我们知道它应该做什么,我们都可以在那里提供帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.