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

2022-06-26 15:13:29 +08:00
 RedisMasterNode

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 文本(其实也不限定形式,其他的输入输出也没问题,可以自己看看代码,看看别人是怎么实现的)

背景

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

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

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

829 次点击
所在节点    问与答
2 条回复
111111111111
2022-06-26 22:23:25 +08:00
输出 SQL 文本简单,已 Django ORM 为例,可以在输出 sql 前修改类的属性,实现修改 sql 的库、表、列名

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

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

所以主楼的问题是,这样的中间件有没有现成的,对不同语法覆盖比较全面的(也就是非玩具的意思)

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

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

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

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

© 2021 V2EX