【问题标题】:Are rake db:create and rake db:migrate idempotent?rake db:create 和 rake db:migrate 是幂等的吗?
【发布时间】:2013-07-23 16:25:42
【问题描述】:

我是 Rails 新手,我想弄清楚 rake db:createrake db:migrate 是否具有幂等性。

换句话说,我可以对我的数据库(postgres 或 mysql)重复运行这两个命令而不会导致问题吗?

这个想法是自动化 Rails 部署,并在每次部署 Rails 应用程序时运行这些命令。我想确保它不会以某种方式破坏数据库。

非常感谢有关 rake db 迁移的幂等性的任何其他问题。

【问题讨论】:

    标签: ruby-on-rails rake rails-migrations


    【解决方案1】:

    是的,它们是幂等的,运行这两个命令应该只是让你的数据库“更新”,一旦你运行它们直到完成,然后再次运行它们应该什么都不做。

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

    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任务,或查看ActiveRecorddatabases.rake源文件直接阅读代码。

    【讨论】:

    • 太棒了。不知道 db:setup。快速跟进。 rake db:setup 也是幂等的吗?
    • 我不确定是否会这样。如果db:seeds 重新运行,取决于您的结构,它可能会在您每次运行时创建新记录。但是由于您自己编写,您也可以检查是否已经存在必要的记录,并仅在必要时创建它们。
    • 另外,您可以从 ActiveRecord 查看 Rakefile 本身的来源,以确定发生了什么:github.com/rails/docrails/blob/master/activerecord/lib/…
    • rake db:setup 不是幂等的。从 3.1.12 开始,它运行 db:schema:loaddb:seed
    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2012-04-13
    • 2018-10-06
    • 1970-01-01
    相关资源
    最近更新 更多