【问题标题】:update strategy for existing grails apps现有 Grails 应用程序的更新策略
【发布时间】:2014-04-13 03:39:23
【问题描述】:

grails 应用程序将包含以下内容: 1) 具有各种领域和与其他模型关系的领域模型。 2) 进入引导程序的预填充数据(例如角色)。

V1 已部署。用户创建更多数据(即数据库中的对象)。

您在 V2 上工作,它更新了领域模型,并且在 boostrap 中也有新的数据项(例如新角色​​)。

如何在不杀死 V1 数据的情况下部署 V2?

引导程序是否再次运行?它怎么知道什么时候运行它?如果是这样,它将覆盖一些现有数据,并添加新数据。在这种情况下,引导程序中的每一项是否都需要首先检查它是否已经存在以避免重复?

架构定义如何更新,如何保存数据?

或者人们是否通过编写单独的 SQL 脚本来手动完成所有更新,添加新的静态数据和更新架构定义?

【问题讨论】:

标签: grails


【解决方案1】:

如对您问题的评论中所述,这些类型的更改最好通过使用DataSource.groovydatabase migration plugin 中的“更新”dbCreate 设置来管理。

除非您将dbCreate 设置为“create-drop”,否则您永远不会破坏现有数据。但是,当您更改域模型时,您可能会发现自己超出了 Grails 可以“更新”的范围,这就是数据库迁移插件的用武之地。

该插件基于 liquibase,并将管理将更改集应用到您的数据库,确保它们只应用一次(除非您另有说明)。这是一个很棒的插件,值得阅读documentation 以充分了解如何使用它。

【讨论】:

  • 我一直在尝试更新。有一些魔法正在发生。不知何故,当我在引导程序中创建对象并多次启动应用程序时,我没有得到多个副本,即使我不检查它们是否已经存在,并且它们没有设置为唯一的,所以它看起来像 bootstrap.groovy没有被执行。但是如果我添加一个新的对象创建,这会神奇地出现在数据库中,而不会复制现有的对象。它还神奇地添加列等而不影响数据。我很惊讶。我读过的两本书中几乎没有记录这个功能。
  • 我可以向您保证,每次应用程序启动时都会运行 Bootstrap.groovy。至于为什么您没有在数据库中获得相同域的多个副本,我怀疑这与 Bootstrap.groovy 类中的代码有关。我强烈建议阅读在线文档。是的,它很长,但包含大量令人敬畏的信息和功能,您在任何书籍中都找不到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多