针对多个数据库系统测试SQL查询

时间:2011-11-08 11:44:55

标签: sql unit-testing database-migration

我参与了从Oracle到PostgreSQL的迁移项目,我正在寻找一种方法来自动测试从Oracle语法转换为PostgreSQL的大量查询。假设数据已成功迁移,因此无需检查。我可以使用Perl或Python从头开始破解解决方案,但可能有更简单的方法。我正在查看数据库测试框架,lke Test :: DBUnut或pgTap,但他们假设用户提供结果以进行验证,在我的情况下,这些是从我们正在迁移的数据库中获取的。问题是,是否有现有的特定于数据库的工具或测试框架来执行针对旧(Oracle)和新(PostgreSQL)数据库的查询,获取结果并进行比较,突出显示过程中可能发生的差异和任何错误?

2 个答案:

答案 0 :(得分:2)

如何创建在不同模式上运行相应查询的JUnit项目(一个Oracle是另一个PostgreSQL)?

或者,您可以创建两个简单的Maven项目(每个供应商一个),每个项目将使用SQL Plugin来运行您的查询(将它们以相同的顺序粘贴到pom.xml中)。您可以稍后使用支持Maven(Hudson?)的持续集成服务器自动执行这些测试并设置计划执行。

祝你好运!

答案 1 :(得分:0)

我最终编写了一个自定义工具来对两个数据库运行查询并使用python psycopg2和cx_oracle收集结果。比较它们是计算每一行的哈希值并检查oracle行是否存在于postgresql行的哈希中。一些陷阱:

  • 从Oracle / PostgreSQL转换为python时,浮点数可能会失去精度。在驱动程序中使用特定于类型的钩子(请参阅文档)以确保将它们转换为十进制,而不是浮动。

  • 很容易从两个数据库中一次读取一行,比较其值并继续前进。但是,除非明确排序SQL结果(使用ORDER BY),否则这将不起作用。不幸的是,一次性读取结果意味着生成大量行的查询需要大量内存。

  • 需要区分产生相同结果的查询 以及在两个数据库上产生0行的那些。后者应该是 检查并且如果查询包含参数,则它们的值应该是 修改。