Python中有哪些好用的SQL解析库?

比如针对 Oracle 中的 SQL 语法结构 sql = "select a.first_name ename,temp.ryxm cname,temp.bm from table1 a,table2 temp where a.manager_id=temp.id;"

问下 python 中有没有现有比较成熟的用于解析 sql 的第三方库( sqlparse 好像不太行),最好是支持多种数据库 SQL 语法格式识别的。

比如解析以上 Oracle 语法 sql 能够区分出类似效果?? 表名:["table1","table2"] 列名:{"table1":"first_name","table2":"ryxm","table2":"bm"}


Python中有哪些好用的SQL解析库?

22 回复

汗,忘了 markdown 格式了
简单的说就是把下面的 sql 解析一下
sql = “select a.first_name ename,temp.ryxm cname,temp.bm from table1 a,table2 temp where a.manager_id=temp.id;”

结果类似:
表名:[“table1”,“table2”]
列名:{“table1”:“first_name”,“table2”:“ryxm”,“table2”:“bm”}


在Python里搞SQL解析,常用的库有这么几个:

sqlparse - 最常用的纯Python解析器,能把SQL拆成token流,适合做格式化和简单分析:

import sqlparse
sql = "SELECT id, name FROM users WHERE age > 25"
parsed = sqlparse.parse(sql)
for statement in parsed:
    for token in statement.tokens:
        print(type(token).__name__, repr(str(token)))

sqlglot - 功能比较全,支持多方言(SQLite/MySQL/PostgreSQL等)的解析、转译和优化:

import sqlglot
sql = "SELECT * FROM t WHERE x = 1"
tree = sqlglot.parse_one(sql, dialect="mysql")
# 转成PostgreSQL语法
print(sqlglot.transpile(sql, read="mysql", write="postgres")[0])

moz-sql-parser - 把SQL转成JSON结构,方便程序处理:

from moz_sql_parser import parse
sql = "select * from users where age > 18"
print(parse(sql))
# 输出:{'select': '*', 'from': 'users', 'where': {'gt': ['age', 18]}}

python-sqlparser(pysqlparser) - 封装了libsqlparser,提供AST访问:

from sqlparser import parse_sql
ast = parse_sql("SELECT a, b FROM t")

选哪个看需求:要轻量用sqlparse,要跨数据库用sqlglot,要结构化数据用moz-sql-parser。

总结:根据具体场景选合适的库。

它好像文档不太全 没找到需要的功能哈 能针对以上的例子请教演示下用法不???

sqlalchemy ?

sqlalchemy ?

sqlalchemy


sqlalchemy 之前没用过,具体如何解析文本 SQL 语句来识别出表名、字段名,得闲的时候可以针对以上的例子具体演示下不???

没有官方驱动吗?

你是说 python 标准库??好像没有解析 sql 语句的

你这已经不叫解析 sql 语句了,你想解析的是 sql 里面的字段,还不如自己写了提取

sqlalchemy 不会去解析 raw sql 的,连更底层的 mysql - python 都不会,解析 sql 语句是在 server 端完成的

刚下班,想问一下,你想做什么功能呢?

从某 oracle 系统导出好多 excel 文件(数量还会增加,数据来源别处不是自己导的),格式是 sheet2 的 A1.value 就是本工作簿数据来源 SQL ,现在想统计出每个工作簿数据都对应使用了 oracle 数据库中的哪些表——所以才想从每个工作簿中取出 sql 语句,从 sql 语句中解析出来表名、字段名等信息
不知道我有没有说明白…

也就是说,你要读取这些 SQL ,然后做分析, SQL 的语法分析?之前看过一篇 blog ,有个人干过这个事情。 http://zh.lucida.me/blog/on-learning-algorithms/ ,这方面没有研究过,但是我觉得你可以从这个思路开始入手。

十分感谢,看来要自己动手了
Python 从 Hello world 到 Import world ,还有很长的路要走 O(∩_∩)O~
参考这一篇文章看看吧,[http://www.tuicool.com/articles/jIZr2q2]( http://www.tuicool.com/articles/jIZr2q2)

我终于找到了几近完美的解决方案,遗憾的是官方没有提供 python 库
看看这里 http://www.sqlparser.com/products.php
![]( http://i4.piimg.com/1c82d93d3877bfb5.png)

不错!

我用 Python Lex-Yacc 撸过一个~ 用在目前公司项目里后闭源了 - -

请问楼主这个问题解决了吗,因为最近也要解析 sql 语句获取表名,没有什么思路,希望楼主能给个方向

同问楼主,这个问题解决了吗,因为最近也要解析 sql 语句获取表名,没有什么思路,希望楼主能给个方向

回到顶部