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

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

  •  
  •   Chabuduo001 · 2020-03-23 23:24:19 +08:00 · 2972 次点击
    这是一个创建于 1707 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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