【问题标题】:Testing SQL queries against multiple database systems针对多个数据库系统测试 SQL 查询
【发布时间】:2011-12-24 09:25:04
【问题描述】:
我参与了一个从 Oracle 到 PostgreSQL 的迁移项目,我正在寻找一种方法来自动测试从 Oracle 语法转换为 PostgreSQL 的大量查询。假设数据已成功迁移,因此无需检查。我可以使用 Perl 或 Python 从头开始破解解决方案,但可能有更简单的方法。我正在查看数据库测试框架,例如 Test::DBUnut 或 pgTap,但它们假设用户提供结果来验证,在我的情况下,这些是从我们要迁移的数据库中获得的。一个问题是,是否有现有的特定于数据库的工具或测试框架来执行对旧 (Oracle) 和新 (PostgreSQL) 数据库的查询,获取结果并比较它们,突出显示过程中可能出现的差异和任何错误?
【问题讨论】:
标签:
sql
unit-testing
database-migration
【解决方案1】:
如何创建在不同模式(一个 Oracle 另一个 PostgreSQL)上运行相应查询的 JUnit 项目?
或者,您可以创建两个简单的 Maven 项目(每个供应商一个),每个项目将使用 SQL Plugin 来运行您的查询(以相同的顺序将它们粘贴到 pom.xml 中)。您可以稍后使用支持 Maven(Hudson?)的持续集成服务器自动执行这些测试并设置计划执行。
祝你好运!
【解决方案2】:
我最终编写了一个自定义工具来对两个数据库运行查询并使用 python psycopg2 和 cx_oracle 收集结果。比较它们是计算每一行的哈希值并检查 oracle 行是否存在于 postgresql 行的哈希值中。几个陷阱:
从 Oracle/PostgreSQL 转换为 python 时,浮点数可能会降低精度。在驱动程序中使用类型特定的钩子(请参阅文档)以确保将它们转换为十进制,而不是浮点数。
从两个数据库中一次读取一行,比较其值并继续前进是很诱人的。但是,这不起作用,除非 SQL 结果被明确排序(使用 ORDER BY)。不幸的是,一次读取所有结果意味着您需要大量内存来处理产生大量行的查询。
需要区分产生相同结果的查询
以及在两个数据库上产生 0 行的那些。后者应该是
检查,如果查询包含参数,它们的值应该
修改。