如果你爱一个人,就让他写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的翻译器相关推荐

  1. docker 启动sqlserver_Docker mssql-server-linux:如何在构建期间启动.sql文件(来自Dockerfile)...

    我正在尝试使用MSSQL DB创建自己的Docker镜像以进行开发.它基于microsoft / mssql-server-linux映像.在构建期间,我想将一些.sql文件复制到容器中,然后运行这些 ...

  2. SQL注入——SQL注入漏洞利用(零)(值得收藏)

    一.什么是SQL注入漏洞 攻击者利用Web应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系 统有特殊意义的符号或命令,让攻击者有机会直接对后台数据库系统下达指令,进而实现对后 台数据库 ...

  3. 动态SQL及SQL片段、_parameter、#{}和${}的区别

    4. 动态SQL及SQL片段 4.1 if <if test="条件">拼接的sql</if> Mybatis中的if标签用于拼接sql.例如: <s ...

  4. sql关于视图的sql_学习SQL:SQL视图

    sql关于视图的sql SQL views are another powerful database object we have at our disposal. In the previous ...

  5. sql动态sql给变量复值_在动态SQL中使用变量

    sql动态sql给变量复值 Before we delve into these SQL concepts, note that I like to do all my development in ...

  6. 学习SQL:SQL Server数据透视表

    In the previous few articles in this series, we've set the foundations on how to create a report. We ...

  7. 学习sql注入:猜测数据库_学习SQL:SQL数据类型

    学习sql注入:猜测数据库 What are SQL data types, why do we need them, and how to use them? Today, we'll try to ...

  8. oracle中的sql%rowcount,sql%found、sql%notfound、sql%rowcount和sql%isopen

    Oracle 存储过程 删除表记录时删除不存在的记录也是显示删除成功 create or replace procedure delDept(p_deptno in dept.deptno%type) ...

  9. PL/SQL -- 动态SQL调用包中函数或过程

    动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...

  10. PL/SQL -- 动态SQL

    --==================== -- PL/SQL --> 动态SQL --==================== 使用动态SQL是在编写PL/SQL过程时经常使用的方法之一.很 ...

最新文章

  1. MySQL - MySQL不同存储引擎下索引的实现
  2. ProtoBuf在使用protoc进行编译时提示: Required fields are not allowed in proto3
  3. Taro+react开发(36)每一个节点要一个view包裹
  4. C++学习之路 | PTA乙级——1090 危险品装箱 (25 分)(精简)
  5. RuoYi-Cloud 进阶篇_03( Seata 高可用集群与 NacosConfig配置中心整合)
  6. 10kv线路负载率计算_10kV配电线路保护的整定计算
  7. HTML期末网页作业-仿QQ官网QQ注册网页
  8. Namenode双机热备之Pacemaker
  9. linux安装mysql要先装jdk吗_linux安装mysql5.7.22,tomcat,jdk
  10. 【Kafka】UnsupportedVersionException: The broker does not support DESCRIBE_LOG_DIRS
  11. UVa 12333 - Revenge of Fibonacci manweifc(模拟加法竖式 字典树)
  12. 【通信基础知识】白噪声、相关解调和相干解调
  13. Java框架全开源商城PC+手机版+微商城独立版+全开源系统源码
  14. c语言中isupper用法,C 库函数 – isupper() - C 教程 - 自强学堂
  15. 控制pico—unity中双目摄像机的clearFlags问题
  16. 墨画子卿第三章:初心第1节:上元灯会
  17. C++:Timer类实现
  18. 人生需要执著——从二本三战到985博士
  19. 盘点2014:10个词让你看懂今年的移动互联网
  20. AtCoder Beginner 217 Solution

热门文章

  1. 本笔记为阿里云天池龙珠计划SQL训练营的学习内容 task 2
  2. 1U和2U服务器应如何正确选择?各有什么优缺点?
  3. HDU - 5411 CRB and Puzzle 矩阵快速幂
  4. c语言围棋ai算法代码,晒晒围棋代码
  5. 晒晒我的通用数据访问层
  6. java集合框架思维导图
  7. 支付宝,微信的提现即时到账。【转账给支付宝用户服务】【企业付款】
  8. 如何从海量数据中,快速采集到你想要的数据?
  9. Wine-QQ与Wine-TIM的Appimage版本
  10. 2级、3级...多级联动