rake db:create 和 rake db:migrate 是否具有幂等性?

4
我刚开始学习Rails,正在试图弄清楚rake db:create和rake db:migrate是否具有幂等性。
换句话说,我能否反复在我的数据库(Postgres或MySQL)上运行这两个命令而不会造成问题?
这样做的想法是为了自动化Rails部署,并让这些命令在每次部署Rails应用程序时运行。我想确保它不会以某种方式破坏数据库。
关于rake db迁移的幂等性的任何其他注意事项都非常感谢。
1个回答

10

是的,它们是幂等的,运行这两个命令应该只是将您的数据库“更新到最新状态”,一旦您将它们运行到完成,然后随后再次运行它们应该不会有任何作用。

然而,设置全新的机器的更好方法是使用

rake db:setup

db:setup 只是按顺序运行这些任务:

db:create
db:schema:load
db:seed

提示:`db:setup` 不运行 `db:migrate`,而是只运行 `db:schema:load`。当您将现有的数据库升级到新版本时,才需要迁移,因为它们描述了两个模式版本之间的差异。但是,当您完全设置新的数据库时,可以跳过所有历史记录和迁移,直接跳转到模式的最新状态,即使用 `db:schema:load` 加载当前模式。如果与应用程序相关,则 `db:seed` 运行您的 `db/seeds.rb` 文件以创建初始数据。
运行 `rake -T` 以详细描述所有 Rails Rake 任务,或查看 ActiveRecord databases.rake 源文件以直接阅读代码。

太棒了。之前不知道有db:setup。快速追问一下,rake db:setup也是幂等的吗? - arrsingh
1
我不确定它是否会这样。如果重新运行 db:seeds,根据你的结构,它可能会每次运行时都创建新记录。但既然你自己编写了代码,你也可以检查必要的记录是否已经存在,只有在必要时才创建它们。 - Stuart M
此外,您可以查看 ActiveRecord 中的 Rakefile 源代码,以确定正在发生什么事情:https://github.com/rails/docrails/blob/master/activerecord/lib/active_record/railties/databases.rake - Stuart M
rake db:setup 不是幂等的。从3.1.12版本开始,它会运行 db:schema:loaddb:seed - platforms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接