想写一个自动测试项目中 Sql 是否正确的开源作品,大家有什么建议吗?

2020-03-23 23:24:19 +08:00
 Chabuduo001

为什么会想做这个开源作品呢?

想法源于之前公司想把项目中 Oracle 数据库换成 Mysql 数据库,那么在整体换完语法以后,怎么确定所有的 Sql 能够正常执行呢?所以就有这样一个想法。想写一个小工具能够自动测试项目中的 Sql 语法是否正确,并且格式化输出错误信息。

2809 次点击
所在节点    程序员
21 条回复
levelworm
2020-03-24 00:51:24 +08:00
直接扔开发数据库看返回错误。。。
xfriday
2020-03-24 01:00:09 +08:00
可以看看 rust 的 sqlx 库
miaoever
2020-03-24 01:28:39 +08:00
这类系统最难的是不仅仅要保证语法的正确性, 而且要保证语义的正确性. 前者很简单, 用支持 Mysql SQL 的 parser 去解析转换后的 SQL 看是否符合语法. 但是后者-语义检测很难.
msg7086
2020-03-24 04:19:50 +08:00
可能只对不用 ORM 的项目有用?
ebingtel
2020-03-24 08:08:28 +08:00
@msg7086 orm 也要转成 sql……得看看 lz 想在哪个层面注入检查了吧
Chabuduo001
2020-03-24 09:26:47 +08:00
@ebingtel 目前想法只针对使用 Mybatis 框架的,想在应用层面进行拦截,执行,捕获异常、截取错误信息
aguesuka
2020-03-24 12:16:49 +08:00
idea 配置数据库后,在 java 代码里,sql 字符串的前一句加上注释 // language=sql
aguesuka
2020-03-24 12:18:03 +08:00
mybatis 的 xml 里就更简单了,idea 里配置好数据库有问题就会报错
littlewing
2020-03-24 12:19:49 +08:00
inception
vanityfairn
2020-03-24 14:14:10 +08:00
我还想过,该怎么去自动检测慢 sql 。
huamiao
2020-03-24 16:02:00 +08:00
应该有一套自动化测试去测试产品,而且不是测试 SQL 的语法。(通常在把 SQL 写进代码前开发总是会自己在 DB 工具里试一下的吧,根本轮不到使用这样一个工具去排错)更何况如果遇到使用 command parameter 的情况,会造成工具的逻辑更加复杂。
Chabuduo001
2020-03-24 16:59:02 +08:00
@huamiao 正常开发肯定是开发在写 sql 的时候就已经自己测过了,但是我的想法源于是在我们公司项目从 Oracle 迁移到 Mysql,所以第一步肯定先改语法,但是改完以后由于 Sql 特别多,所以就想开发层面搞一个工具自己测一下,看从 Oracle 语法改到 Mysql 语法对不对,总不可能自己一个一个 sql 跑吧。
qwerthhusn
2020-03-24 17:10:47 +08:00
方言问题很麻烦
而且对于 group by 有那种 only_full_group_by 限制等等细节问题
huamiao
2020-03-24 17:14:30 +08:00
@Chabuduo001 正常做法是项目应该有自己的自动化测试,迁移完跑一遍自动化测试就结了。
回到问题本身,如果你解决了 sql 提取规整的问题,大约向服务区发送 EXPLAIN 请求可以来进行验证吧。(完全是猜测,未在代码层面验证过)
xcstream
2020-03-24 17:14:44 +08:00
感觉比较难还是要人肉功能测试
JoshuaJin
2020-03-24 18:44:10 +08:00
如果单纯迁移的是 sql 可能还好些,我们现在迁移的是 Oracle 的存储过程,也没有很好的办法~~
Chabuduo001
2020-03-24 21:27:59 +08:00
@JoshuaJin 哈哈,我们还没到存储过程这一步,因为刚把语法改过来,这个项目就黄了。 但是一直有这个想法。
xyjincan
2020-03-24 21:32:06 +08:00
定义一个不兼容的关键字集合
aitaii
2020-03-24 21:36:03 +08:00
迁移存储过程和触发器的逻辑才是头大,我司去年下半年花了 1 个月的时间由 Oracle 迁移到 Mysql 了,对应的性能也需要额外的优化。
wangxiyu191
2020-03-24 21:37:33 +08:00
这个说起来某云有两整套产品干这个。。基本思路是流量镜像然后对比。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/655541

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX