背景
我有一个使用 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 设置为验证。稍后会详细介绍)
采取的步骤
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
从上面,再次运行 add-simple-domain.groovy
,但它没有提到我刚刚创建的新域类。 (它有索引/序列,但我认为这是一个 known issue )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/