Sql 完成数据库模式转换-如何测试重写的查询?
我们的数据库设计得很糟糕,我们继承了它。我已经将模式修改为可用和可维护的模式。相当多的表和列被删除,许多列被移动,大多数表和列被重命名。某些数据类型也已更改 我已经从我们的网络应用程序中提取了所有查询,并开始重写它们。我们认为,我们的DBA能够将旧数据迁移到新模式。为了确保这一点,我们需要通过比较新旧结果来测试每个查询 我们如何测试这种大规模迁移?我需要能够指定参数,并将旧表/列映射到新表/列。有数百个查询,这是一项艰巨的任务。我可以自己写一些东西,但我已经对时间有很多要求,所以最好使用现有的工具Sql 完成数据库模式转换-如何测试重写的查询?,sql,database-migration,database-testing,Sql,Database Migration,Database Testing,我们的数据库设计得很糟糕,我们继承了它。我已经将模式修改为可用和可维护的模式。相当多的表和列被删除,许多列被移动,大多数表和列被重命名。某些数据类型也已更改 我已经从我们的网络应用程序中提取了所有查询,并开始重写它们。我们认为,我们的DBA能够将旧数据迁移到新模式。为了确保这一点,我们需要通过比较新旧结果来测试每个查询 我们如何测试这种大规模迁移?我需要能够指定参数,并将旧表/列映射到新表/列。有数百个查询,这是一项艰巨的任务。我可以自己写一些东西,但我已经对时间有很多要求,所以最好使用现有的工
谢谢 有时简单的解决方案就可以解决问题 如果只是选择,您可以将新的和旧的查询放在文本文件中,使用脚本运行它们并区分输出
cd newqueries
for queryfile in *; do
psql -f $queryfile migrateddb > /tmp/newresult
psql -f ../oldqueries/$queryfile olddb > /tmp/oldresult
if ! diff /tmp/oldresult /tmp/newresult; then
echo "Difference in $queryfile"
exit 1
fi
done
或者您可以编写一个基于单元测试的结果比较这就是我的方法: 恢复具有数据的测试数据库,运行所有已知查询。 恢复另一个测试数据库,运行所有新查询。 创建连接每个数据库表的sql脚本并比较结果。根据供应商的不同,这可以通过信息模式或其他系统表来完成 插入临时表 从db1..name中选择select count1 ,从db2..name中选择count1 ,从db1.name t1中选择count1,然后在t1.col1=t2.col1和t1.colx=t2.colx上连接db2.name t2 ,表名
然后,您可以运行查询中包含表名的查询。它会给你一个起点,让你知道该去哪里看。我不得不这么做。。。这很容易,因为我重写了整个应用程序 许多查询听起来像是选择、插入、更新等基本操作还没有在函数中抽象出来——也许这有助于在适应之前清理混乱 现在进行测试: 您需要一个测试脚本,它将 a运行所有查询 b存储所有选择的输出以进行比较 备份测试数据库@state 0,清除常规查询日志 使用所有的删除、选择和更新功能,在应用程序周围玩游戏 复制粘贴该日志,进行每一次选择,并在其前面创建一个表TESTERABLE_xyz,当然也可以选择TESTERABLE_xyz。。取决于可用的语法 迁移脚本后,在两个数据库上运行test db@state 0和test db@state 0 比较 如果你能确保你使用了每个应用程序中的每一项功能,这应该可以做到
GL-没有什么比让现有的东西更好了 不幸的是,我们还有插入、更新和删除。上次我只是更改了数据库并手动完成了所有查询。搜索和替换帮助。我试着测试应用程序,但直到后来才发现一些迁移错误。jkj,这可能也是我们的未来,尽管它令人沮丧。我们有一个测试人员,但他不称职,几个月后就要退休了,所以现在真正的责任落在了开发人员身上。谢谢顺便说一句,我试着在评论中提到你,但它一直被过滤掉-一定是你的名字太短了?我知道了为什么你的名字被剥夺了…这是故意的:至少我今天学到了一些东西!是 啊对不起,我帮不了你。希望其他人能提供合适的工具。顺便问一下,这个网络应用程序是哪种语言的?我最后就是这么做的。我编写了一个应用程序来测试查询前后,并比较结果。查询、新旧映射和断言都是用XML指定的。