相关文章推荐
彷徨的匕首  ·  Use data operations ...·  2 月前    · 
任性的斑马  ·  Rust在Linux中不能编译为可执行文件·  2 年前    · 
豪情万千的松鼠  ·  苹果python脚本怎么用,如何将Apple ...·  2 年前    · 
讲道义的鞭炮  ·  小程序canvas的那些事 | 微信开放社区·  2 年前    · 
潇洒的茶叶  ·  SQL:CASE 表达式应用总结 - ...·  2 年前    · 
飘逸的打火机  ·  java本地发送邮件正常,布置在linux上 ...·  2 年前    · 
Code  ›  使用sqlparse库解析 SQL语句开发者社区
token table
https://cloud.tencent.com/developer/article/2247471
才高八斗的豆浆
2 年前
作者头像
yuezht
0 篇文章

使用sqlparse库解析 SQL语句

原创
前往专栏
腾讯云
备案 控制台
开发者社区
学习
实践
活动
专区
工具
TVP
文章/答案/技术大牛
写文章
社区首页 > 专栏 > 数据库技术日积月累 > 正文

使用sqlparse库解析 SQL语句

原创
发布 于 2023-03-28 14:17:57
348 1
举报

sqlparse 是 Python 的非验证 SQL 解析器。 它提供对 SQL 语句的解析、拆分和格式化的支持。不废话,我们直接上代码。

import sqlparse
def parse_sql(sql):
    # 使用 sqlparse 库解析 SQL 查询语句
    parsed = sqlparse.parse(sql)[0]
    # 获取查询类型(SELECT、INSERT、UPDATE 或 DELETE)
    query_type = parsed.get_type()
    # 获取查询目标(表名、字段列表、值列表等)
    if query_type == 'SELECT':
        target = parse_select(parsed)
    elif query_type == 'INSERT':
        target = parse_insert(parsed)
    elif query_type == 'UPDATE':
        target = parse_update(parsed)
    elif query_type == 'DELETE':
        target = parse_delete(parsed)
    else:
        target = None
    return {'type': query_type, 'target': target}
def parse_select(parsed):
    # 获取字段列表
    fields = []
    for token in parsed.tokens:
        if isinstance(token, sqlparse.sql.IdentifierList):
            for identifier in token.get_identifiers():
                fields.append(identifier.value)
        elif isinstance(token, sqlparse.sql.Identifier):
            fields.append(token.value)
    # 获取表名
    for token in parsed.tokens:
        if isinstance(token, sqlparse.sql.Where):
            table = token.tokens[2].value
            break
    else:
        table = None
    # 获取条件
    for token in parsed.tokens:
        if isinstance(token, sqlparse.sql.Where):
            condition = token.tokens[4].value
            break
    else:
        condition = None
    return {'fields': fields, 'table': table, 'condition': condition}
def parse_insert(parsed):
    # 获取表名
    table = parsed.tokens[2].value
    # 获取字段列表
    fields = []
    for token in parsed.tokens:
        if isinstance(token, sqlparse.sql.Parenthesis):
            for identifier in token.get_identifiers():
                fields.append(identifier.value)
    # 获取值列表
    values = []
    for token in parsed.tokens:
        if isinstance(token, sqlparse.sql.Values):
            for value_list in token.get_parameters():
                values.append([value.value for value in value_list])
    return {'table': table, 'fields': fields, 'values': values}
def parse_update(parsed):
    # 获取表名
    table = parsed.tokens[2].value
    # 获取字段列表和值列表
    fields = []
    values = []
    for token in parsed.tokens:
        if isinstance(token, sqlparse.sql.IdentifierList):
            for identifier in token.get_identifiers():
                fields.append(identifier.value)
        elif isinstance(token, sqlparse.sql.Assignment):
            fields.append(token.left.value)
            values.append(token.right.value)
    # 获取条件
    for token in parsed.tokens:
        if isinstance(token, sqlparse.sql.Where):
            condition = token.tokens[4].value
            break
    else:
        condition = None
    return {'table': table, 'fields': fields, 'values': values, 'condition': condition}
def parse_delete(parsed):
    # 获取表名
    table = parsed.tokens[2].value
    # 获取条件
    for token in parsed.tokens:
        if isinstance(token, sqlparse.sql.Where):
 
推荐文章
彷徨的匕首  ·  Use data operations in Power Automate - Power Automate | Microsoft Learn
2 月前
任性的斑马  ·  Rust在Linux中不能编译为可执行文件
2 年前
豪情万千的松鼠  ·  苹果python脚本怎么用,如何将AppleScript嵌入Python脚本中?_ww09的博客-CSDN博客
2 年前
讲道义的鞭炮  ·  小程序canvas的那些事 | 微信开放社区
2 年前
潇洒的茶叶  ·  SQL:CASE 表达式应用总结 - 何永灿 - 博客园
2 年前
飘逸的打火机  ·  java本地发送邮件正常,布置在linux上报:Could not connect to SMTP host: smtp.163.com, port: 25_寻梦太极的博客-CSDN博客
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号