使用sqlparse解析table_name,支持子查询, left join等
import sqlparse
from sqlparse.sql import IdentifierList, Identifier
from sqlparse.tokens import Keyword, DML # 支持的join方式
ALL_JOIN_TYPE = ('LEFT JOIN', 'RIGHT JOIN', 'INNER JOIN', 'FULL JOIN', 'LEFT OUTER JOIN', 'FULL OUTER JOIN') def is_subselect(parsed):
"""
是否子查询
:param parsed:
:return:
"""
if not parsed.is_group:
return False
for item in parsed.tokens:
if item.ttype is DML and item.value.upper() == 'SELECT':
return True
return False def extract_from_part(parsed):
"""
提取from之后模块
:param parsed:
:return:
"""
from_seen = False
for item in parsed.tokens:
if from_seen:
if is_subselect(item):
for x in extract_from_part(item):
yield x
elif item.ttype is Keyword:
from_seen = False
continue
else:
yield item
elif item.ttype is Keyword and item.value.upper() == 'FROM':
from_seen = True def extract_join_part(parsed):
"""
提交join之后模块
:param parsed:
:return:
"""
flag = False
for item in parsed.tokens:
if flag:
if item.ttype is Keyword:
flag = False
continue
else:
yield item
if item.ttype is Keyword and item.value.upper() in ALL_JOIN_TYPE:
flag = True def extract_table_identifiers(token_stream):
for item in token_stream:
if isinstance(item, IdentifierList):
for identifier in item.get_identifiers():
yield identifier.get_name()
elif isinstance(item, Identifier):
yield item.get_name()
elif item.ttype is Keyword:
yield item.value def extract_tables(sql):
"""
提取sql中的表名(select语句)
:param sql:
:return:
"""
from_stream = extract_from_part(sqlparse.parse(sql)[0])
join_stream = extract_join_part(sqlparse.parse(sql)[0])
return list(extract_table_identifiers(from_stream)) + list(extract_table_identifiers(join_stream)) print(extract_tables("select x1, x2 from a left join b on a.id = b.id right join c on c.id = a.id"))
print(extract_tables("select x1, x2 from (select x1, x2 from (select x1, x2 from a)) left join b on a.id=b.id"))
使用sqlparse解析table_name,支持子查询, left join等的更多相关文章
- mysql sql_safe_updates 不支持子查询的更新。
考虑到开发人员有时候不小心误更新数据,要求线上库的 MySQL 实例都设置 sql_safe_updates=1 来避免没有索引的 update.delete. 结果有一天开发发现下面的一个SQL 没 ...
- mysql update不支持子查询更新
先看示例: SELECT uin,account,password,create_user_uin_tree FROM sys_user 结果: 表中的create_user_uin_tree标识该条 ...
- 数据库子查询和join的比较
子查询进行SELECT语句嵌套查询,可以一次完成很多逻辑上需要多个步骤才能完成的SQL操作.子查询虽然很灵活,但是执行效率并不高. select goods_id,goods_name from go ...
- 为什么MySQL不推荐使用子查询和join
前言: 1.对于mysql,不推荐使用子查询和join是因为本身join的效率就是硬伤,一旦数据量很大效率就很难保证,强烈推荐分别根据索引单表取数据,然后在程序里面做join,merge数据. 2.子 ...
- SpringJDBC的JdbcTemplate在MySQL5.7下不支持子查询的问题
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [ SELECT ...
- hive中的子查询改join操作(转)
这些子查询在oracle和mysql等数据库中都能执行,但是在hive中却不支持,但是我们可以把这些查询语句改为join操作: -- 1.子查询 select * from A a where a.u ...
- Linq To Sql 语法 子查询 & In & Join
子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 =from cin ctx.Customers where ...
- MySQL改写子查询成Join
有时用别的方式而不是子查询可以获得更高的性能 : For example: SELECT * FROM t1 WHERE id IN (SELECT id FROM t2); 改写: SELECT D ...
- Django ORM queryset object 解释(子查询和join连表查询的结果)
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) --- ...
- SQL的子查询与JOIN的小试牛刀
//学生表CREATE TABLE student( ID INT PRIMARY KEY, s_name ) NOT NULL, class_id INT NOT NULL); , "qf ...
随机推荐
- installer 命令介绍
installer 命令是 macOS 系统中用于在命令行界面下安装 .pkg 格式的安装包的工具.这个命令特别有用于自动化安装软件或者在没有图形用户界面的情况下进行软件安装,比如在远程管理或者终端会 ...
- MonoDevelop 的续集dotdevelop
DotDevelop 是一个跨平台的 .NET 集成开发环境(IDE),它原本是 MonoDevelop 的分支项目,这个项目更侧重于 Linux 支持和 GTK3 升级,github:https:/ ...
- Spring —— 事务简介
Spring 事务 简介 事务作用:在数据层保障一系列的数据库操作同成功同失败 Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败 小案例 添加事务管理: ...
- win10安装linux的gcc
mysy2下载gcc 过程比较艰苦,2024年秋冬讲课,被linux毒打了3天 pacman -S mingw-w64-ucrt-x86_64-gcc 这个一次成功,不行继续接大招 实在不行安装 ...
- C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
错误原因 VS平台认为scanf函数不安全,要求换成scanf_s函数 解决方案 方案一:将scanf换成scanf_s[不建议] 将scanf换成scanf_s 但是,scanf_s函数只能在vs上 ...
- Linux 提高cache命中率方法
提高缓存命中率是优化系统性能的关键策略之一.以下是一些提高缓存命中率的有效方法: 数据局部性优化: 空间局部性:优化数据访问模式,使得数据访问在空间上连续,比如通过循环展开和数据重排. 时间局部性:确 ...
- 封装一个Promise.all 的函数
// 1. 准备三个异步函数 const promise1 = Promise.resolve('prom11ise1'); const promise2 = new Promise(function ...
- C# 的布尔类型和字符串类型(模板字符串)
// 布尔类型 boll bool b = false; b = 1 == 1; // true bool b1 = 1 > 23; // false // 值类型 : 在代码中初始化类型的时候 ...
- kubernetes中pod的隔离策略
配置容器级别的安全控制 使用宿主机的网络模式 可以通过设置pod的spec的hostNetwork参数为true开启容器的"host"network模式 spec: hostNet ...
- 云原生周刊:在 Kubernetes 集群中使用通配符证书 | 2024.2.19
开源项目推荐 kube-fledged kube-fledged 是一个 Kubernetes Operator,用于直接在 Kubernetes 集群的工作节点上创建和管理容器映像的缓存.它允许用户 ...