首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
GeekHub
Chabuduo001
V2EX  ›  程序员

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

  •  
  •   Chabuduo001 · 16 天前 · 1497 次点击

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

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

    21 条回复    2020-03-25 10:30:11 +08:00
    levelworm
        1
    levelworm   16 天前 via Android
    直接扔开发数据库看返回错误。。。
    xfriday
        2
    xfriday   16 天前
    可以看看 rust 的 sqlx 库
    miaoever
        3
    miaoever   16 天前   ❤️ 1
    这类系统最难的是不仅仅要保证语法的正确性, 而且要保证语义的正确性. 前者很简单, 用支持 Mysql SQL 的 parser 去解析转换后的 SQL 看是否符合语法. 但是后者-语义检测很难.
    msg7086
        4
    msg7086   16 天前
    可能只对不用 ORM 的项目有用?
    ebingtel
        5
    ebingtel   16 天前
    @msg7086 orm 也要转成 sql……得看看 lz 想在哪个层面注入检查了吧
    Chabuduo001
        6
    Chabuduo001   16 天前
    @ebingtel 目前想法只针对使用 Mybatis 框架的,想在应用层面进行拦截,执行,捕获异常、截取错误信息
    aguesuka
        7
    aguesuka   16 天前 via Android
    idea 配置数据库后,在 java 代码里,sql 字符串的前一句加上注释 // language=sql
    aguesuka
        8
    aguesuka   16 天前 via Android
    mybatis 的 xml 里就更简单了,idea 里配置好数据库有问题就会报错
    littlewing
        9
    littlewing   16 天前 via iPhone
    inception
    vanityfairn
        10
    vanityfairn   16 天前
    我还想过,该怎么去自动检测慢 sql 。
    huamiao
        11
    huamiao   16 天前
    应该有一套自动化测试去测试产品,而且不是测试 SQL 的语法。(通常在把 SQL 写进代码前开发总是会自己在 DB 工具里试一下的吧,根本轮不到使用这样一个工具去排错)更何况如果遇到使用 command parameter 的情况,会造成工具的逻辑更加复杂。
    Chabuduo001
        12
    Chabuduo001   16 天前
    @huamiao 正常开发肯定是开发在写 sql 的时候就已经自己测过了,但是我的想法源于是在我们公司项目从 Oracle 迁移到 Mysql,所以第一步肯定先改语法,但是改完以后由于 Sql 特别多,所以就想开发层面搞一个工具自己测一下,看从 Oracle 语法改到 Mysql 语法对不对,总不可能自己一个一个 sql 跑吧。
    qwerthhusn
        13
    qwerthhusn   16 天前
    方言问题很麻烦
    而且对于 group by 有那种 only_full_group_by 限制等等细节问题
    huamiao
        14
    huamiao   16 天前
    @Chabuduo001 正常做法是项目应该有自己的自动化测试,迁移完跑一遍自动化测试就结了。
    回到问题本身,如果你解决了 sql 提取规整的问题,大约向服务区发送 EXPLAIN 请求可以来进行验证吧。(完全是猜测,未在代码层面验证过)
    xcstream
        15
    xcstream   16 天前
    感觉比较难还是要人肉功能测试
    JoshuaJin
        16
    JoshuaJin   16 天前
    如果单纯迁移的是 sql 可能还好些,我们现在迁移的是 Oracle 的存储过程,也没有很好的办法~~
    Chabuduo001
        17
    Chabuduo001   15 天前
    @JoshuaJin 哈哈,我们还没到存储过程这一步,因为刚把语法改过来,这个项目就黄了。 但是一直有这个想法。
    xyjincan
        18
    xyjincan   15 天前
    定义一个不兼容的关键字集合
    aitaii
        19
    aitaii   15 天前
    迁移存储过程和触发器的逻辑才是头大,我司去年下半年花了 1 个月的时间由 Oracle 迁移到 Mysql 了,对应的性能也需要额外的优化。
    wangxiyu191
        20
    wangxiyu191   15 天前
    这个说起来某云有两整套产品干这个。。基本思路是流量镜像然后对比。
    purensong
        21
    purensong   15 天前
    小米有 soar 这个平台可以检测 SQL,我最近也有个想法就是去给这项目贡献,添加一些常用 SQL 错误的改写,提供修复变形 SQL 功能
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3154 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:02 · PVG 21:02 · LAX 06:02 · JFK 09:02
    ♥ Do have faith in what you're doing.