【问题标题】:How to handle Play Framework 2 database evolutions in production如何在生产环境中处理 Play Framework 2 数据库演变
【发布时间】:2013-01-30 23:45:06
【问题描述】:

似乎每当我更改模型时,Play Framework 都会要求我运行一个脚本来删除我的整个架构并重新创建它。显然这不适用于生产,那么在生产中处理这个问题的正确方法是什么?

注意,我使用的是 ebean 和 Postgres,并托管在 heroku 上。

【问题讨论】:

    标签: java postgresql playframework playframework-2.0 playframework-evolutions


    【解决方案1】:

    很遗憾Ebean 只能创建CREATE DDL(而不是UPDATE DDL)(作为answered on their group),因此您需要尽快切换到manual evolutions

    一些规则:

    1. 在实施任何更改之前始终备份您的实时数据库 :)
    2. 如果 ebean 插件只有 1.sql 由它创建的进化,它会重新创建整个 DDL
    3. 您需要从1.sql 中删除两个第一个 cmets,并开始编写自己的演进,下一个编号为2.sql3.sql 等。在切换到手动演进之前尝试放置尽可能多的模型/字段。最大的部分将由插件自动完成。
    4. 手动演化应该包含ALTERS 到现有的表/列而不是 DROP/CREATE,它们应该同时具有:UpsDowns 用于每个更改。
    5. 尝试在每次演进中尽可能多地进行更改,这样更容易管理,然后为每个小更改编写单独的演进。

    事实上,有时使用 DB gui 修改 DB 结构更容易,无论如何它主要适用于单个开发人员...当您需要与其他开发人员共享代码时,编写演变将是更好的选择。

    如果一段时间后您将添加新模型的下一个“大”部分,您可以再次启用临时自动 DDL 并使用本地 git 来复制新部分。然后恢复到自己的革命并粘贴由Ebean插件生成的新部分。

    【讨论】:

      【解决方案2】:

      Biesior 基本上总结得很好。但是,作为 Play 的初学者,我发现用一个具体的例子进行更多的说明可能会有所帮助。

      首先,以下示例适用于 Java。

      假设你添加了一个新字段

      public String dum_str;
      

      在您的模型 Dum 中。然后,您需要在conf/evolutions/ 下有一个2.sql,如下所示:

      # --- !Ups
      ALTER TABLE dum ADD COLUMN dum_str VARCHAR(255);
      
      # --- !Downs
      ALTER TABLE dum DROP dum_str;
      

      我希望这会有所帮助。

      【讨论】:

      • 很好的答案,对于更多的读者来说,它是 ALTER TABLE dum DROP COLUMN dum_str; (请注意列)。
      猜你喜欢
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 2019-04-18
      • 1970-01-01
      • 2013-05-13
      • 2021-05-21
      • 1970-01-01
      相关资源
      最近更新 更多