当前位置: 首页 > article >正文

第6篇:中间件 SQL 重写与语义分析引擎实现原理

6.1 章节导读

SQL 是数据库中间件的“输入语言”。
在一个真正强大的中间件系统中,SQL 语句的执行通常不再是“原封不动”地传递给数据库,而是需要先经过:

  1. 语义分析:解析 SQL 的结构和含义。

  2. SQL 重写:根据中间件逻辑,自动转换为合适的 SQL 片段(如分表、路由、权限控制等)。

本篇将带你逐步深入了解:
SQL 语法与语义分析如何实现
SQL 重写常见场景
如何构建可扩展的 SQL 解析与重写模块

6.2 什么是 SQL 重写?

SQL 重写(SQL Rewrite)是指中间件对接收到的原始 SQL 语句进行结构性改造,以适应其分库分表、数据权限控制等业务逻辑的需求。

📘 示例:

用户发起的原始 SQL:

SELECT * FROM orders WHERE user_id = 123;

在分表场景下,可能会被重写为:

SELECT * FROM orders_3 WHERE user_id = 123;

(如对 user_id 做了 hash 分表)

6.3 SQL 语义分析模块设计

中间件要理解一条 SQL 的含义,必须先进行语法解析(Parsing)+ 语义分析(Analysis)。 解析过程分三步:

1️⃣ 词法分析(Lexing)

将 SQL 文本切分为“词元”(token),如 SELECT, FROM, 表名、字段等。

工具推荐:ANTLR, Flex, JSQLParser, Apache Calcite

2️⃣ 语法分析(Parsing)

构建 SQL 的 抽象语法树(AST),以结构化方式表示 SQL 的组成。

SELECT ├── columns: * ├── from: orders └── where: └── user_id = 123  语义分析(Semantic Analysis)

识别 SQL 的执行目标和类型:

SQL 类型示例
查询类SELECT, SHOW, DESC
修改类INSERT, UPDATE, DELETE
DDL类CREATE, DROP, ALTER
特殊类SET, USE, CALL

6.4 SQL 重写常见场景

1️⃣ 分库分表 SQL 重写

  • 替换表名:将 table 改为 table_x

  • 追加路由字段过滤条件(如:user_id)

2️⃣ SQL 权限控制重写

  • 添加租户条件:

-- 原始 SQL
SELECT * FROM products;-- 重写后
SELECT * FROM products WHERE tenant_id = 1001;

3️⃣ 多租户字段注入

  • 动态在 INSERT/UPDATE 中添加租户字段

6.5 SQL 重写引擎设计

一个典型的 SQL 重写模块包括以下几个组成部分:

模块功能
AST 提取器提取目标表、字段、条件等信息
表路由器计算目标库和目标表
重写器重构新的 SQL 字符串
安全过滤器防止注入、限制敏感语句

示例代码(伪 Python 实现)

class SQLRewriter:def rewrite(self, sql_ast, user_id):table_name = sql_ast.get_table()table_index = hash(user_id) % 4new_table = f"{table_name}_{table_index}"sql_ast.set_table(new_table)return sql_ast.to_sql()

 6.6 SQL 安全增强与合法性检查

在生产环境中,SQL 重写模块还应承担SQL 安全过滤器角色:

  • 禁止危险操作(DROP TABLE, DELETE *, UPDATE WHERE 1=1

  • 拒绝跨库访问或非法表名

  • 限制查询深度与行数(如默认添加 LIMIT


🧱 6.7 SQL AST 与插件机制

为了支持不同 SQL 重写逻辑(如分表、权限、审计),可以引入插件机制

SQL AST │ ┌─────────┴──────────┐ │ Plugin: │ │ ├── 路由重写插件 │ │ ├── 权限增强插件 │ │ └── 安全过滤插件 │ └────────────────────┘

这样便于后期扩展与维护,每个插件只关心自身职责。

6.8 模块设计总结

模块关键能力
SQL Parser支持主流 SQL 语法解析
AST Builder构建结构化抽象语法树
Rewriter针对业务场景重构 SQL
Plugin Engine插件式可扩展逻辑
Security Guard拦截危险/非法 SQL

 小结

本篇带你完成了以下内容:

  • 理解 SQL 重写在中间件系统中的核心作用;

  • 构建语义分析模块的关键步骤;

  • 多种 SQL 重写策略场景及实现方式;

  • 如何设计可扩展、可插拔的 SQL 重写引擎。

相关文章:

第6篇:中间件 SQL 重写与语义分析引擎实现原理

6.1 章节导读 SQL 是数据库中间件的“输入语言”。 在一个真正强大的中间件系统中,SQL 语句的执行通常不再是“原封不动”地传递给数据库,而是需要先经过: 语义分析:解析 SQL 的结构和含义。 SQL 重写:根据中间件逻辑…...

基于SpringBoot的“嗨玩旅游”网站设计与实现(源码+定制+开发)嗨玩旅游平台开发:景点展示与个性化推荐系统(SpringBoot)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

python版若依框架开发:python版若依部署

python版若依框架开发 从0起步,扬帆起航。 python版若依部署文章目录 python版若依框架开发1.源码2.概述3.部署1.源码 https://gitee.com/insistence2022/RuoYi-Vue-FastAPI 请诸君移步上述链接,即可对python版若依项目进行初步了解。 2.概述 若依框架本身基于java,可以快…...

React进阶:状态管理选择题

React进阶:状态管理选择题 引言 随着React应用复杂度增加,选择合适的状态管理方案成为我们面临的关键决策。 状态管理本质上是解决"谁来存储数据"以及"如何更新和分发这些数据"的问题。在React生态中,随着应用规模扩大…...

h5的aliplayer-min.js 加密视频会走到debugger

h5的aliplayer-min.js 如果 https://g.alicdn.com/apsara-media-box/imp-web-player/2.19.0/aliplayer-min.js走加密视频的话会有debugger 更换aliplayer-min.js版本解决了 https://g.alicdn.com/apsara-media-box/imp-web-player/2.25.1/aliplayer-min.js 对应css&#xff1a…...

第5篇《中间件负载均衡与连接池管理机制设计》

5.1 章节导读 在数据库中间件中,如何高效地管理数据库连接与请求调度至关重要。 本节围绕两个核心模块展开: 连接池管理:提升连接复用能力,避免频繁建立/断开连接。 负载均衡策略:合理调度 SQL 请求,提升…...

DashBoard安装使用

DashBoard安装使用 一、实验目的 1、掌握dashboard 的安装部署 2、熟悉图像化部署任务:产生pod---定义服务--验证访问 二、实验内容: 1、配置步骤 1.1、Helm安装 离线安装(适用于内网/离线环境) # 根据系统架构选择版本&am…...

极客大挑战 2019 EasySQL 1(万能账号密码,SQL注入,HackBar)

题目 做法 启动靶机,打开给出的网址 随便输点东西进去,测试一下 输入1、1’、1"判断SQL语句闭合方式 输入以上两个都是以下结果 但是,输入1’时,出现的是另外结果 输入1,1"时,SQL语句没有…...

C# CallerMemberName特性

当你在一个方法运用了CallerMemberName特性,编译器会自动将调用该方法的方法或属性的名称作为该参数的默认值,可应用于MVVM框架。 代码: using System.ComponentModel; using System.Runtime.CompilerServices;public class Person : INoti…...

采用 Docker GPU 部署的 Ubuntu 或者 windows 桌面环境

# 国内下载不了 docker pull gezp/ubuntu-desktop:24.04-cu12.6.2# 阿里云镜像 docker pull registry.cn-hongkong.aliyuncs.com/gezp/ubuntu-desktop:24.04-cu12.6.2# create container with nomachine docker run -d --restarton-failure --name myubuntu --shm-size1024m -e…...

关于面试找工作的总结(四)

不同情况下收到offer后的处理方法 1.不会去的,只是面试练手2.还有疑问,考虑中3.offer/职位不满足期望的4.已确认,但又收到更好的5.还想挽回之前的offer6.确认,准备入职7.还想拖一下的1.不会去的,只是面试练手 HR您好,非常荣幸收到贵司的offer,非常感谢一直以来您的帮助,…...

分布式拜占庭容错算法——实现工作量证明(PoW)算法详解

Java 实现工作量证明(PoW)算法详解 一、PoW 核心原理 #mermaid-svg-AAj0Pvst1PVcVy5v {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-AAj0Pvst1PVcVy5v .error-icon{fill:#552222;}#mermaid…...

深度解析Mysql中MVCC的工作机制

MVCC,多版本并发控制 定义:维护一个数据的多个版本,使读写操作没有冲突,依赖于:隐藏字段,undo log日志,readView MVCC会为每条版本记录保存三个隐藏字段 DB_TRX_ID: 记录最近插入或修改该记录的事务IDDB_R…...

MP4文件声音与视频分离

最近学习PR剪辑 要添加视频文件和音频文件 但是直接给MP4文件 得到的是一个整体 不管怎么切分 都是无法得到单独的整体 这就需要将视频文件和音频文件分离 我推荐使用ffmpeg工具进行分离 迅雷链接:https://pan.xunlei.com/s/VORu5x64jjL-gXFd_VTpYjRPA1?pwd8wec#…...

接口自动化测试之pytest 运行方式及前置后置封装

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、Pytest 优点认知 1.可以结合所有的自动化测试工具 2.跳过失败用例以及失败重跑 3.结合allure生产美观报告 4.和Jenkins持续集成 5.很多强大的插件 pytest-htm…...

服务器被攻击了怎么办

可以上一个高防IP或者AI云防护都是可以的。(有效防御CC、APl接口、http、tcp、WEB应用扫描/爬虫、SYN、WAF、DDOS、UDP、入侵、渗透、SQL注入、XSS跨站脚本攻击、远程恶意代码执行、session fixation、Webshell攻击、恶意请求,恶意扫描、暴力破解、CSRF等…...

06-排序

排序 1. 排序的概念及其应用 1.1 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键…...

python,shell,linux,bash概念的不同和对比联系

一、基本概念理解 1. Linux 是一个 操作系统内核,常与 GNU 工具集成组成完整的 Linux 操作系统。 提供对硬件的管理能力与系统调用接口。 用户通过 Shell 或 GUI 与 Linux 交互。 2. Shell 是用户与 Linux 内核之间的 命令行解释器(CLI)…...

FPGA管脚类型,及选择

fpga的IO Type选择,如下: 具体的定义:...

如何在 Ubuntu22.04 上安装并开始使用 RabbitMQ

单体架构学的差不多了,可以朝着微服务进军了,笔者打算实操一下 RabbitMQ(这个和 Redis 一样重要的组件) 笔者这里采用的是本地 wsl2 的 Ubuntu22.04 先按指定的博客进行前置操作 Ubuntu22.04 安装 RabbitMQ 解决 ARM Ubuntu 22.04 缺少 libs…...

R-CNN 模型算法流程梳理

目录 一、R-CNN整体流程 二、需要注意的地方 论文连接:[1311.2524] Rich feature hierarchies for accurate object detection and semantic segmentation 如果你之前了解过RNN,很容易混淆认为R-CNN也具有RNN的时序循环功能,这种理解是错误…...

细说C语言将格式化输出到FILE *stream流的函数fprintf、_fprintf_I、fwprintf、_fwprintf_I

目录 1、将格式化数据输出到FILE *stream流基本型 (1)语法 (2)参数 (3)示例 2、将格式化数据输出到FILE *stream流并启用并启用在格式字符串中使用参数的顺序的规范 (1)语法 …...

本地日记本,用于记录日常。

文章目录 想法程序说明展望 想法 本人想要复盘以前的事情,所以就想着写一个小程序,记录一下一天发生了什么事情。以后如果忘记了可以随时查看。写日记的想法来自我看的一本书,里面有一段话说的意思是,经验从来都不是随着年龄增长…...

[蓝桥杯]格子刷油漆

格子刷油漆 题目描述 X 国的一段古城墙的顶端可以看成 2N2N 个格子组成的矩形(如下图所示),现需要把这些格子刷上保护漆。 你可以从任意一个格子刷起,刷完一格,可以移动到和它相邻的格子(对角相邻也算数&…...

Monorepo架构: 项目管理工具介绍、需求分析与技术选型

概述 如何实现 monorepo,以及在项目中如何管理多个包,在进行具体项目开发前,有必要强调一个重要思维 — 全局观 即看待技术方案时,要从需求角度出发,综合考量该方案能否长远满足项目或团队需求 为什么要有全局观呢&a…...

ubuntu下libguestfs-tools

在ubuntu下,使用libguestfs-tools工具挂载其他磁盘和分区。 首先安装libguestfs-tools将vmx虚拟磁盘共享:sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other执行如下命令查看分区名称:virt-filesystems -a /mnt/hgfs/D/vmware/FGT_VM64-v7…...

Authentication failed(切换了新的远程仓库tld)

启用 Git Credential Manager git config --global credential.helper manager 强制弹出凭据输入窗口 git config --global credential.helper.modalprompt true 指定 TFS 服务器使用基础认证(Basic Auth) git config --global credential.https://…...

【Web应用】若依框架:基础篇14 源码阅读-后端代码分析-课程管理模块前后端代码分析

文章目录 一、课程管理模块前端代码截图二、前端代码及分析index.vuecourse.js 三、前端执行流程1. 组件初始化2. 查询操作3. 列表操作4. 对话框操作5. API 请求6. 执行流程总结关键点 四、课程管理模块后端代码截图五、后端代码块CourseControllerICourseServiceCourseMapperC…...

在 Linux 上安装 `pgvector`(这是一个 PostgreSQL 的向量类型扩展,常用于处理嵌入向量,便于进行向量相似度搜索)

1. 安装 PostgreSQL 确保你已经安装好 PostgreSQL 数据库。 例如在 Ubuntu 上: sudo apt update sudo apt install postgresql postgresql-contrib2. 安装依赖 pgvector 扩展用的是 make、gcc 等开发工具,因此你需要先安装 PostgreSQL 的开发包和编译…...

09.MySQL内外连接

09.MySQL内外连接 文章目录 MySQL内外连接 内连接 外连接 左外连接 右外连接 简单案例 MySQL内外连接 在数据库操作中,表的连接是一个非常重要的概念。简单来说,连接就是将两个或多个表中的数据按照某种规则结合起来,从而获取我们所需要的…...