浅析构建SQL-to-SQL的翻译器
如果你爱一个人,就让他写SQL,因为那是天堂。
如果你恨一个人,就让他写SQL,因为那是地狱。
天堂,是因为他如此简单,又功能强大,可以极大简化你的程序。
地狱,是因为他如此纷繁,复杂,还有各种方言标准,而且不通用,当你试图切换数据库产品的时候,什么叫生不如死 ......
那我们就不能构建一个统一的数据库语言么?这个真不能,不是技术上不能,而是利益趋势,大家坚守自己的方言堡垒,而且越建越高。
ORM或许是解决这个问题的一个途径,正如其名,既然是对象关系映射,未免就会是一套机械、呆板的程序,我们只能将关系和实体映射出来,所以,这并非是解决问题的根本途径,但不能否认它确实是最受欢迎,使用最广泛,代价最小的方案,没有之一。
那我们是不是能从SQL语言翻译的角度来解决这个问题呢?即在将SQL抛给数据库执行之前,进行一次翻译工作?
我们可以对SQL进行语法分析,形成一颗AST(抽象语法树),然后遍历解析
我们在遍历语法树的时候,就进行一次翻译转换,形成其他方言的SQL。
这个方案也许不尽善尽美,但是至少解决了一个类似“同声传译”的问题。
对上述模型进一步演化,在AST层面进行双向转化,那这个实现是不是就看起来非常优雅了?
我们已经定制了一条看似合理的Roadmap,那么如何将其实现落地呢?
下表,是我对可完成上述任务的框架进行的一些总结
个人是十分推崇Calcite的,因为其本身更像是一个没有物理引擎的数据库引擎,这可能听起来有点滑稽,但是确实,他可以很好的解析SQL,并生成执行计划,如果你想,也可以针对其进行你希望的优化,这就让我们的控制力大大加强了,至少在数据库之上,就可以“为所欲为”了。
Durid提供的方言包,比较多,上手比较容易(文末附录里,贴出了一个查询的AST,结构还是挺清晰的),不过如果想达到AST层面的转换,对整套API需要进行一定的手术才行。
Antlr 可以说是非常强大的,他是单纯的语法解析工具,但是其语法文件比起javacc来,何止是平易近人,简直就是平易近人... 而且,shardingsphere,presto都是基于其开发的。在代码仓库里,也有很多线程的语法文件,可以使用,不过要达到上述目的,也需要走很长的路。
好了,今天就先扯到这,感谢大家的阅读,如果对你有些帮助,那将是我莫大的荣幸,也期待你能关注我,和我交流。
附录:以durid为例,下图展示了一条查询语句的AST
关注 【 麒思妙想】解锁更多硬核。
历史文章导读:
抽象语法树为什么抽象
基于Calcite自定义SQL解析器
基于JDBC实现VPD:SQL解析篇
如何成为一个成功的首席数据官
数据库深度研究(100页PPT)
基于Win10单机部署kubernetes应用
浅谈基于JDBC实现虚拟专用数据库(VPD)
国查:用中文编写SQL
如果文章对您有那么一点点帮助,我将倍感荣幸
欢迎 关注、在看、点赞、转发
浅析构建SQL-to-SQL的翻译器相关推荐
- docker 启动sqlserver_Docker mssql-server-linux:如何在构建期间启动.sql文件(来自Dockerfile)...
我正在尝试使用MSSQL DB创建自己的Docker镜像以进行开发.它基于microsoft / mssql-server-linux映像.在构建期间,我想将一些.sql文件复制到容器中,然后运行这些 ...
- SQL注入——SQL注入漏洞利用(零)(值得收藏)
一.什么是SQL注入漏洞 攻击者利用Web应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系 统有特殊意义的符号或命令,让攻击者有机会直接对后台数据库系统下达指令,进而实现对后 台数据库 ...
- 动态SQL及SQL片段、_parameter、#{}和${}的区别
4. 动态SQL及SQL片段 4.1 if <if test="条件">拼接的sql</if> Mybatis中的if标签用于拼接sql.例如: <s ...
- sql关于视图的sql_学习SQL:SQL视图
sql关于视图的sql SQL views are another powerful database object we have at our disposal. In the previous ...
- sql动态sql给变量复值_在动态SQL中使用变量
sql动态sql给变量复值 Before we delve into these SQL concepts, note that I like to do all my development in ...
- 学习SQL:SQL Server数据透视表
In the previous few articles in this series, we've set the foundations on how to create a report. We ...
- 学习sql注入:猜测数据库_学习SQL:SQL数据类型
学习sql注入:猜测数据库 What are SQL data types, why do we need them, and how to use them? Today, we'll try to ...
- oracle中的sql%rowcount,sql%found、sql%notfound、sql%rowcount和sql%isopen
Oracle 存储过程 删除表记录时删除不存在的记录也是显示删除成功 create or replace procedure delDept(p_deptno in dept.deptno%type) ...
- PL/SQL -- 动态SQL调用包中函数或过程
动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...
- PL/SQL -- 动态SQL
--==================== -- PL/SQL --> 动态SQL --==================== 使用动态SQL是在编写PL/SQL过程时经常使用的方法之一.很 ...
最新文章
- MySQL - MySQL不同存储引擎下索引的实现
- ProtoBuf在使用protoc进行编译时提示: Required fields are not allowed in proto3
- Taro+react开发(36)每一个节点要一个view包裹
- C++学习之路 | PTA乙级——1090 危险品装箱 (25 分)(精简)
- RuoYi-Cloud 进阶篇_03( Seata 高可用集群与 NacosConfig配置中心整合)
- 10kv线路负载率计算_10kV配电线路保护的整定计算
- HTML期末网页作业-仿QQ官网QQ注册网页
- Namenode双机热备之Pacemaker
- linux安装mysql要先装jdk吗_linux安装mysql5.7.22,tomcat,jdk
- 【Kafka】UnsupportedVersionException: The broker does not support DESCRIBE_LOG_DIRS
- UVa 12333 - Revenge of Fibonacci manweifc(模拟加法竖式 字典树)
- 【通信基础知识】白噪声、相关解调和相干解调
- Java框架全开源商城PC+手机版+微商城独立版+全开源系统源码
- c语言中isupper用法,C 库函数 – isupper() - C 教程 - 自强学堂
- 控制pico—unity中双目摄像机的clearFlags问题
- 墨画子卿第三章:初心第1节:上元灯会
- C++:Timer类实现
- 人生需要执著——从二本三战到985博士
- 盘点2014:10个词让你看懂今年的移动互联网
- AtCoder Beginner 217 Solution