【问题标题】:Grails database migration gorm diff yields no changesGrails 数据库迁移 gorm diff 没有产生任何变化
【发布时间】:2016-08-14 00:27:46
【问题描述】:

背景

我有一个使用 3.0.14 的相对较新的 Grails 项目。我希望通过Database Migration plugin (2.0.0.RC4) 集成 liquibase 以进行数据库迁移。

到目前为止,我有一个足够大的域模型,我已经使用该插件来“播种”初始变更日志。这直接来自文档,并按预期工作:

grails dbm-generate-gorm-changelog changelog.groovy

我现在尝试测试/开始工作的是dbm-gorm-diff 命令,它将对域模型进行更改并创建一个可以应用的更改日志。这就是我遇到问题的地方。

Grails documentation 建议从数据源中删除 dbCreate 块,以确保 Hibernate 不会进行更新,并且 Liquibase 可以接管。太好了,正是我想要的。

问题

当我删除dbCreate 时,Grails/hibernate 似乎仍然会在数据库迁移插件有机会进行差异之前更新数据库。在进行 diff 时,已经为时已晚,无法看到更改,因此更改日志不包含正确的数据。

配置

dataSource:
    pooled: true
    jmxExport: true
    driverClassName: org.h2.Driver
    username: sa
    password:

environments:
    development:
        dataSource:
            dbCreate: verify
            driverClassName: org.postgresql.Driver
            dialect: org.hibernate.dialect.PostgreSQLDialect
            url: jdbc:postgresql://127.0.0.1:5432/liquibase_test
            username: dbuser
            password: dbuser
            logSql: false
            formatSql: true

(我知道 dbCreate 设置为验证。稍后会详细介绍)

​​>

采取的步骤

  1. 创建一个新的 postgres 数据库 - dbcreate -U dbuser liquibase_test
  2. 在新数据库上运行初始变更日志 - grails dbm-update
  3. 验证数据库现在是最新的,并检查select * from databasechangelog 是否等于changelog.groovy 中的更改次数
  4. 添加一个新的简单域类:

    class TestDomain {
        int testInt
    }
    
  5. 运行插件以获取差异 - grails dbm-gorm-diff add-simple-domain.groovy。该命令失败并出现异常:

     :DataModel:dbmGormDiff
     Command execution error: liquibase.command.CommandExecutionException: java.lang.NullPointerException
     DataModel:dbmGormDiff FAILED
    
  6. 现在,从上面删除配置dbCreate: verify,然后再次运行

  7. 这样顺利完成,没有异常,但是有问题:

    • 该命令创建了add-simple-domain.groovy,但它没有提及我刚刚创建的新域类。 (它有索引/序列,但我认为这是known issue
    • 新的域类已添加到数据库中(!?)(在 PgAdmin 中检查)
    • databasechangelog 仍然具有原始行数,即使在询问时也没有对新域类的引用

所以,我无法解释发生了什么。我可以处理额外的创建/删除索引和序列,但我似乎无法让 liquibase 的东西正常工作。谁能帮我解释一下?

编辑

我对 NullPointer 做了更多的挖掘,它似乎来自 liquibase/ext/hibernate/snapshot/ForeignKeySnapshotGenerator.java:45 类,插件试图在其中构造继承表 id 字段的外键(使用 tablePerHierarchy false 进行此继承)。经过体面的搜索后,我找不到任何与此错误相关的内容。

编辑#2

我在 Github 上发现了 tablePerHierarchy NPE 的问题:https://github.com/grails-plugins/grails-database-migration/issues/68

【问题讨论】:

  • 我现在也有同样的问题。似乎需要使用其中一个 dbCreate 值......但只有将其设置为空才能使插件工作。从那以后你还有什么发现吗?

标签: grails grails-orm liquibase


【解决方案1】:

更新您的数据源的application.yml(或application.groovy)配置:

dataSource:
    dbCreate: none

设置为“无”与完全删除 dbCreate 不同 - 您需要明确设置它以覆盖在其他地方设置的任何默认值。

【讨论】:

    【解决方案2】:

    "none" 在使用 JNDI 数据源时似乎对我不起作用,并且仍然导致 ddl 运行。我将其设置为“忽略”以便能够在 Grails 3.0.x 中将 db-migrations 与 JNDI 数据源一起使用

    【讨论】:

      【解决方案3】:

      我最终通过在我的application.groovy 中设置hibernate.hbm2ddl.auto = 'none' 来实现此功能。有趣的是,当我尝试将相同的配置放入我的 application.yml 时,它没有任何效果。

      我怀疑这里可能有其他力量在起作用,因为我尝试在一个新的 Grails 项目上复制该行为而没有问题。

      目前我已经决定在 groovy 文件中使用 hibernate 属性,但我仍然很好奇为什么我不能让配置像普通项目一样为我工作。

      【讨论】:

        猜你喜欢
        • 2012-05-06
        • 2014-07-01
        • 2012-09-03
        • 2014-12-12
        • 1970-01-01
        • 1970-01-01
        • 2015-03-06
        • 1970-01-01
        • 2017-01-08
        相关资源
        最近更新 更多