如何在Liquibase diff中忽略大小写和数字类型



我正在做一个项目,让公司里的每个人都开始使用Liquibase来管理我们的数据库,这样我们就不会有SQL的随机片段四处传播。这一点尤其重要,因为我们将与使用许多不同数据库的客户合作。

采用新方法有一些阻力,所以我想建立一个自动测试,启动内存中的数据库,从更改日志创建它,然后将该数据库与我们的DEV和UAT数据库进行比较,如果它们不同,就会失败(因为这意味着有人手动添加/删除/更改了表或列)。

然而,我使用我的变更日志创建了一个oracle模式,然后我使用相同的变更日志旋转H2,在我的diff中我得到这样的条目:

defaultValue changed from 'null' to 'NULL'
type changed from 'NUMBER(19, 2)' to 'DECIMAL(19, 2)'
type changed from 'DATE(7)' to 'DATE(8)'

这让我的考试每次都不及格,变得毫无意义。有没有办法让liquibasediff忽略大小写,并意识到数字和小数是一样的?(或者,如果它们不一样,为什么它在oracle中以一种方式创建,而在H2中以另一种方式?)

我可以构建自己的"忽略值"one_answers"忽略类型"映射,但这似乎有点像重新发明轮子,我认为有一些现有的解决方案。或者,如果这有帮助的话,我很高兴离开H2,转而使用德比或其他什么。

感谢您的帮助!

PS我正在使用Liquibase 3.2.2

PPS我正在Oracle模式下创建H2数据库:

jdbc:h2:mem:end2end;MODE=Oracle;DB_CLOSE_DELAY=-1

跨数据类型比较数据类型很困难,因为即使是"等效"的数据类型也可能存在一些人关心而有些人不关心的差异。

改进跨数据库类型比较将是Liquibase 4.0的一部分,但目前你唯一真正的选择是编写一个自定义的Liquibase扩展,以处理你遇到的情况。Liquibase的一般扩展文件位于http://liquibase.org/extensions但您特别需要的是对liquibase.diff.compare.core.ColumnComparator进行子类化,并重写findDifferences()方法来删除在"类型"上发现的差异,这些差异实际上并不是差异。

对于您看到的带有null的案例问题,可能会在即将发布的3.3.0中进行修复。我无法在当前的代码库中复制它,但如果你想尝试从https://liquibase.jira.com/builds/browse/CORE-LB如果你还看到这个问题,请告诉我。

最新更新