gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:07:30 25 4
gpt4 key购买 nike

背景

我有一个使用 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com