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

Posted

技术标签:

【中文标题】如何忽略 Liquibase diff 中的大小写和数字类型?【英文标题】:How to ignore case and number types in Liquibase diff? 【发布时间】:2014-10-23 13:18:38 【问题描述】:

我正在开展一个项目,让公司中的每个人都开始使用 Liquibase 来管理我们的数据库,这样我们就不会到处乱跑 SQL 的随机 sn-ps。这一点尤其重要,因为我们将与使用多种不同数据库的客户合作。

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

但是,我使用我的变更日志创建了一个 oracle 架构,然后我使用相同的变更日志启动了 H2,在我的差异中我得到了这样的条目:

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

这使我的测试每次都失败,使其毫无意义。有没有办法让 liquibase diff 忽略大小写,并意识到数字和小数是相同的? (或者如果它们不一样,为什么它在 oracle 中以一种方式创建它而在 H2 中以不同的方式创建它?)

我可以构建自己的“忽略值”和“忽略类型”映射,但这似乎有点像重新发明***,我假设有一些现有的解决方案。或者,如果这对我有帮助,我很乐意离开 H2 并改用 Derby 或其他东西。

感谢任何帮助!

PS 我使用的是 Liquibase 3.2.2

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

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

【问题讨论】:

hsqldb "oracle mode" 旨在理解 Oracle 语法查询,但当您自省时,它的设计并不完全像 oracle 数据库......总之,差异可能是不可避免的,我不要认为可以告诉 liquibase 忽略它(您也许可以编写一个小程序来解析 diff 的输出并自行决定是否存在合法 diff) 【参考方案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 构建快照,如果您仍然看到问题,请告诉我。

【讨论】:

以上是关于如何忽略 Liquibase diff 中的大小写和数字类型?的主要内容,如果未能解决你的问题,请参考以下文章

Liquibase:diff 总是生成索引

我不明白 liquibase diff 试图通过这些选择来确定啥?

liquibase diff 不起作用

如何告诉Liquibase忽略db.changelog * .xml?

如何使 liquibase 的 LoadData 标签不区分大小写?

N天学习一个linux命令之diff