Grails 数据库迁移 gorm diff 不会产生任何变化

标签 grails grails-orm liquibase

背景

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

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

grails dbm-generate-gorm-changelog changelog.groovy

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

Grails documentation建议删除 dbCreate阻止数据源以确保 Hibernate 不进行更新,而 Liquibase 可以接管。太好了,正是我想要的。

问题

当我删除 dbCreate ,Grails/hibernate 似乎仍然在 Database Migration 插件有机会做 diff 之前更新数据库。在进行 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 设置为验证。稍后会详细介绍)

采取的步骤
  • 创建一个新的 postgres 数据库 - dbcreate -U dbuser liquibase_test
  • 在新数据库上运行初始更改日志 - grails dbm-update
  • 验证数据库现在是最新的,并检查 select * from databasechangelog等于 changelog.groovy 中的更改次数
  • 添加一个新的简单域类:
    class TestDomain {
        int testInt
    }
    
  • 运行插件以获取差异 - grails dbm-gorm-diff add-simple-domain.groovy .该命令失败并出现异常:
     :DataModel:dbmGormDiff
     Command execution error: liquibase.command.CommandExecutionException: java.lang.NullPointerException
     DataModel:dbmGormDiff FAILED
    
  • 现在,删除配置 dbCreate: verify从上面,再次运行
  • 这无一异常(exception)地顺利完成,但存在问题:
  • 创建的命令 add-simple-domain.groovy ,但它没有提到我刚刚创建的新域类。 (它有索引/序列,但我认为这是一个 known issue )
  • 新域类 已添加 到数据库(!?)(在 PgAdmin 中检查)
  • table 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

    最佳答案

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

    dataSource:
        dbCreate: none
    

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

    关于Grails 数据库迁移 gorm diff 不会产生任何变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36758835/

    相关文章:

    spring - 运行时出现 Grails 事务管理器异常

    grails - Grails是否继承hasMany关系?

    grails - 如何修改现有域并将新属性更新到Bootstrap?

    java - Quarkus:每次测试后清理 H2 DB

    java - 没有创建 liquibase.change.core.RawSQLChange 的逆

    Grails - 如何实现不使用 id 列的外键关系?

    oracle - 如何在 HQL 查询中使用 native sql 函数?

    Grails 加载数据一次

    mongodb - GORM 独立 : no updateOne() with maps

    liquibase - 重复的列名,在注释变更集并取消注释后在 liquibase 中