【发布时间】: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 设置为验证。稍后会详细介绍)
>采取的步骤
- 创建一个新的 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,然后再次运行-
这样顺利完成,没有异常,但是有问题:
- 该命令创建了
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