calcite 是一个数据源管理工具,前面已经讲到的,这里来讲讲基于calcite 实现方言的切换。比如最近比较火的信创,或许可以帮我们大忙。
假定我们的sql如下:
select * from table limit 1
而如果此时我需要在sqlserver 库下执行此sql,那么必然是不能执行的,因为sqlserver 是不支持limit语法的。而我们可以通过calcite指定源sql语法为mysql,此时,在对应数据库执行时会自动翻译为sqlserver。
如果你使用了连接池,可以在获取calcite 连接的时候指定:
此时,calcite将以mysql标准语法去解析你编写的sql。
前一文我们对calcite JdbcScheme进行了源码级解析(https://www.jianshu.com/p/d62adef269b2?v=1732787956843)。
我们知道,calcite 会先将mysql 语法转换为关系代数,再将关系代数转换为sql对象,再将sql对象根据不同的方言进行sql输出,可以达到方言转换的目的。这样就可以大大减轻数据库信创的工作量(当然很多信创数据库没有实现,需要自己去实现对应的方言,这里仅提供一些思路,本人也实现了一些信创,但这里不方便公开出来)。
按此操作后,你就会惊喜的发现,最终执行的sql会被翻译为:
select top(1) * from table
不过在mysql 分页在转sqlserver的时候,需要注意编写order by 语句,这块社区已经有issue了,原因可以参考:
https://issues.apache.org/jira/browse/CALCITE-4968