V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
RedisMasterNode
V2EX  ›  问与答

请教 V 友 有分表 SQL 改写的基础组件/包推荐吗,将普通 SQL 改写成分表 SQL

  •  
  •   RedisMasterNode · 2022-06-26 15:13:29 +08:00 · 830 次点击
    这是一个创建于 881 天前的主题,其中的信息可能已经有所发展或是发生改变。

    TL;DR

    如果我们想在应用层屏蔽分表的实现,那基于 ORM 或者原生 SQL 可能会执行:

    SELECT a.id, a.user_id, a.birthday FROM a WHERE a.user_id=12345 ORDER BY a.birthday;
    

    实际上真实执行的 SQL 应该是:

    SELECT a_0045.id, a_0045.user_id, a_0045.birthday FROM a_0045 WHERE a_0045.user_id=12345 ORDER BY a_0045.birthday;
    

    请教各位 V 友有没有用过类似的基础组件,任何包或者工具平台都可以,输入是 SQL 文本输出也是 SQL 文本(其实也不限定形式,其他的输入输出也没问题,可以自己看看代码,看看别人是怎么实现的)

    背景

    我们在之前的尝试中发现的一些问题 /需求:

    • 尽可能覆盖多的 MySQL 语法;之前用过一些开源项目不会改写 SELECT xxxx FROM ... 里面 SELECT 和 FROM 之间的内容,只改写了 WHERE 条件里的内容,换句话说就是改写得不够完整,可能又很多语法没有尝试解析,举例:
      • JOIN 查询没改写
      • 子查询或类似的嵌套 SQL 没改写,或者改写不完整

    如果有胖友用过好用的组件或者平台的话求安利,如果没有的话咱也考虑自己写一个试试,看看能覆盖到多少的语法,好用再开源出来。

    这样的组件如果只是负责 SQL 改写,可以很方便适配不同的客户端,例如 Go 语言里面 MySQL 的 client 常见的有 GORM / XORM / database/sql 等等,先实现 SQL 改写,再实现不同 client 的扩展包应该就很简单而且兼容。

    2 条回复    2022-06-27 01:13:17 +08:00
    111111111111
        1
    111111111111  
       2022-06-26 22:23:25 +08:00
    输出 SQL 文本简单,已 Django ORM 为例,可以在输出 sql 前修改类的属性,实现修改 sql 的库、表、列名

    如果要求输入 SQL 的,恐怕要有一个 SQL 解析器,解析成 SQL 生成器能读懂的样子,感觉麻烦很多。。

    弱弱的问一下,如果只是改表名的的话,正则替换可不可以。。。
    RedisMasterNode
        2
    RedisMasterNode  
    OP
       2022-06-27 01:13:17 +08:00
    @111111111111 输入是原始 SQL 文本,输出是改写后 SQL 文本,我们设想的是经过 parser 解析之后改写的这个中间件,不是 Django ORM 这类上层应用。不管上层是什么应用,Django ORM 也好,SQLAlchemy 也好,它看到的应该都是原始的 SQL ,也就是不察觉到分表的存在,真正执行的是被中间件层改写过的 SQL 。

    所以主楼的问题是,这样的中间件有没有现成的,对不同语法覆盖比较全面的(也就是非玩具的意思)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2704 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:18 · PVG 20:18 · LAX 04:18 · JFK 07:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.