如果我们想在应用层屏蔽分表的实现,那基于 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 文本(其实也不限定形式,其他的输入输出也没问题,可以自己看看代码,看看别人是怎么实现的)
我们在之前的尝试中发现的一些问题 /需求:
SELECT xxxx FROM ...
里面 SELECT 和 FROM 之间的内容,只改写了 WHERE 条件里的内容,换句话说就是改写得不够完整,可能又很多语法没有尝试解析,举例:如果有胖友用过好用的组件或者平台的话求安利,如果没有的话咱也考虑自己写一个试试,看看能覆盖到多少的语法,好用再开源出来。
这样的组件如果只是负责 SQL 改写,可以很方便适配不同的客户端,例如 Go 语言里面 MySQL 的 client 常见的有 GORM
/ XORM
/ database/sql
等等,先实现 SQL 改写,再实现不同 client 的扩展包应该就很简单而且兼容。
1
111111111111 2022-06-26 22:23:25 +08:00
输出 SQL 文本简单,已 Django ORM 为例,可以在输出 sql 前修改类的属性,实现修改 sql 的库、表、列名
如果要求输入 SQL 的,恐怕要有一个 SQL 解析器,解析成 SQL 生成器能读懂的样子,感觉麻烦很多。。 弱弱的问一下,如果只是改表名的的话,正则替换可不可以。。。 |
2
RedisMasterNode OP @111111111111 输入是原始 SQL 文本,输出是改写后 SQL 文本,我们设想的是经过 parser 解析之后改写的这个中间件,不是 Django ORM 这类上层应用。不管上层是什么应用,Django ORM 也好,SQLAlchemy 也好,它看到的应该都是原始的 SQL ,也就是不察觉到分表的存在,真正执行的是被中间件层改写过的 SQL 。
所以主楼的问题是,这样的中间件有没有现成的,对不同语法覆盖比较全面的(也就是非玩具的意思) |