【问题标题】:How to avoid loss of DB when changing Grails domain class in development在开发中更改 Grails 域类时如何避免 DB 丢失
【发布时间】:2012-08-27 08:49:14
【问题描述】:

Grails 2.0 的优点之一是您可以在开发中更改域类,而无需重新启动应用程序服务器。这可行,但是当我更改域类时,我会丢失所有引导数据,这基本上没有达到目的。我正在使用默认的 h2 数据库。

解决此问题的最佳方法是什么?我必须去像 Postgres 这样的外部数据库吗?

【问题讨论】:

    标签: grails grails-orm grails-domain-class grails-2.0


    【解决方案1】:

    新创建的 Grails 2 应用程序中的默认 DataSource.groovy 具有

    environments {
        development {
            dataSource {
                dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', ''
                url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
            }
        }
    

    create-drop 表示只要应用程序重新启动,数据库就会从头开始重新创建。如果您想要一个在重启后仍然存在的数据库,请将其更改为类似

    dataSource {
        dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
        url = "jdbc:h2:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
    }
    

    (即将create-drop 更改为update 并从url 中删除:mem)。但是请注意,并非您对域类所做的所有更改都可以反映在update 可以应用的有限架构更改中。添加属性应该没问题,但删除属性或更改影响模式生成的约束可能需要您删除并重新创建数据库(停止应用程序,删除 devDb 文件并重新启动它)。

    【讨论】:

    • 好的,谢谢。问题是当你修改例如一个服务类,应用程序不需要重新启动。但显然修改域类会强制某种重启 - 足以删除数据库但不能再次运行 Bootstrap。我想如果我想保持 create-drop 行为,我可以将逻辑从 Bootstrap 移动到另一个类,然后编写脚本以通过 Event 左右在重新启动时运行。
    猜你喜欢
    • 1970-01-01
    • 2021-03-18
    • 2014-07-30
    • 2022-06-13
    • 1970-01-01
    • 2014-03-18
    • 2012-11-16
    • 2018-09-18
    • 1970-01-01
    相关资源
    最近更新 更多