rake db之间的区别:migrate db:reset和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:迁移尚未运行的运行(单一)迁移。
- db:create创build数据库
- db:drop删除数据库
-
db:schema:load在schema.rb之后的(现有)数据库中创build表和列
-
db:setup does db:create,db:schema:load,db:seed
- db:reset do db:drop,db:setup
通常情况下,在通过新的迁移文件对模式进行更改之后,您将使用db:migrate(只有在数据库中已有数据时才有意义)。 db:schema:在您设置应用程序的新实例时使用load。
我希望有帮助。
更新轨3.2.12:
我刚刚检查了源代码,依赖关系现在是这样的:
- db:create为当前env创build数据库
- db:create:all为所有的envs创build数据库
- db:drop删除当前env的数据库
- db:drop:全部删除所有的envs的数据库
- db:migrate为当前尚未运行的env运行迁移
- db:migrate:up运行一个特定的迁移
- db:migrate:down回滚一个特定的迁移
- db:migrate:status显示当前的迁移状态
- db:回滚回滚最后的迁移
- db:forward将当前模式版本推进到下一个版本
- db:seed (only)运行db / seed.rb文件
- db:schema:load将模式加载到当前env的数据库中
-
db:schema:dump转储当前env的模式(好像还创build了db)
-
db:setup运行db:schema:load,db:seed
- db:重置运行db:drop db:setup
- db:migrate:根据指定的迁移(db:migrate:down db:migrate:up)或(db:rollback db:migrate)
- db:migrate:重置运行db:drop db:创builddb: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)
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
对现有模式进行更改。 它就像创build模式的版本。 db:migrate
将在db/migrate/
查找任何ruby文件,并执行从最旧的开始没有运行的迁移。 Rails通过查看迁移文件名开始处的时间戳,知道哪个文件最早。 db:migrate
带来的好处是数据也可以放在数据库中。 这实际上不是一个好的做法。 最好使用rake db:seed
来添加数据。
rake db:migrate
提供任务向上 , 向下等,使rake db:rollback
等命令成为最有用的命令。
rake db:reset
做一个db:drop
和db:setup
它删除数据库,再次创build它,加载模式,并使用种子数据进行初始化
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
据我所知,它将放弃您的数据库,并基于您的db/schema.rb
文件重新创build它。 这就是为什么你需要确保你的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
这可能不会回答你的问题,但可以给你一些洞察,继续看看特别是耙文件和任务的来源。 由于他们在帮助您使用rails方面做得相当不错,他们并不总是能够很好地logging代码。 如果我们知道应该做什么,我们都可以在那里帮助。