使用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 ...
随机推荐
- androi studio bitmap 压缩后 图片方向异常
Android 使用 Camera2拍照后,获得 byte[] data,随后使用 BitmapFactory.decodeByteArray 压缩 导致图片方向异常 /* * 避免出现方向异常 * ...
- ComfyUI 基础教程(二) —— Stable Diffusion 文生图基础工作流及常用节点介绍
上一篇文章讲解述首次启动 ComfyUI 会自动打开一个最基础的文生图工作流.实际上,后续我们可以通过菜单选项,或者快捷键 ctrl + D来打开这个默认工作流.默认工作流如下: 这是一个最基础的文生 ...
- Unity中利用遗传算法训练MLP
Unity中利用遗传算法训练MLP 梯度下降法训练神经网络通常需要我们给定训练的输入-输出数据,而用遗传算法会便捷很多,它不需要我们给定好数据,只需要随机化多个权重进行N次"繁衍进化&quo ...
- 最小化安装killall不可用
最小化安装killall不可用 最小化安装Centos7.4后,发现killall命令不可用 使用了以下命令,查看软件包名: yum search killall 查找后发现应使用这个安装包 yum ...
- C++ weak_ptr除了解决循环引用还能做什么?
C++: weak_ptr到底有什么用? 很多人对std::weak_ptr的认识只是不增加std::shared_ptr的引用计数,可以用来解决std::shared_ptr可能造成的循环引用问题. ...
- 04. 寻找两个正序数组的中位数 Golang实现
题目: 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 算法的时间复杂度应该为 O(log (m+n)) . 示例 1: ...
- MDC – Material Design, Angular Material, MDC, MWC, Lit 的关系
前言 它们关系挺乱的, 而且不只是我一个人感觉乱 还有 所以这篇做一个整理吧. Material Design Google 的设计指南. 早年用于 Android Apps, 现在也用于 Web A ...
- Angular 学习笔记 work with excel (导出 excel)
更新: 2020-04-15 补上 read excel 先用 file reader 把文件变成 buffer 然后调用 exceljs 就可以了, 它很聪明的哦, date number, boo ...
- MySQL 大表拆分
概述 在实际工作中,在关系数据库(MySQL.PostgreSQL)的单表数据量上亿后,往往会出现查询和分析变慢甚至无法执行统计分析的情况.这时就需要将大表拆分为多个小表,将小表分布在多个数据库上,形 ...
- JVM(JAVA Virtual Machine)Java虚拟机
JVM的跨平台性 一次编写,到处运行 JVM将字节码文件编译成对应操作系统的机器码 JVM的语言无关性 JVM的内存区域 虚拟机栈:在JVM运行过程中存储当前线程运行方法所需的数据,指令.返回地址 本 ...