我正在开展一个项目,让公司的每个人都开始使用Liquibase来管理我们的数据库,这样我们就不会有随机的SQL片段。这一点尤为重要,因为我们将与使用多个不同数据库的客户合作。
对采用新方法存在一些阻力,所以我想设置一个自动化测试来旋转内存数据库,从更改日志创建它,然后将此数据库与我们的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
答案 0 :(得分:0)
比较数据类型的数据类型很困难,因为即使等同于"数据类型可能会有一些人关心的差异,有些人不会。
改进跨数据库类型比较将是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构建快照,请告诉我您是否仍然看到此问题。