相关文章推荐
跑龙套的茶壶  ·  LODOP打印table超宽用省略号带'-' ...·  2 月前    · 
瘦瘦的电池  ·  div中的table内容过多时不超出div的 ...·  2 月前    · 
潇洒的香瓜  ·  阿杰学python----pymysql ...·  2 月前    · 
豪气的感冒药  ·  MySQL :: MySQL ...·  1 月前    · 
气宇轩昂的香瓜  ·  Copy and transform ...·  1 月前    · 
威武的茶叶  ·  2023年浦东新区公办小学招生地段公示·  5 月前    · 
忐忑的领带  ·  广东省应急管理厅网站·  9 月前    · 
鼻子大的人字拖  ·  中纪委:严禁违规参加老乡会校友会意在保护干部 ...·  11 月前    · 
有情有义的小马驹  ·  How to use ...·  1 年前    · 
有胆有识的人字拖  ·  :app:generateCrashlyti ...·  1 年前    · 
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):
 
推荐文章
跑龙套的茶壶  ·  LODOP打印table超宽用省略号带'-'的内容换行问题 - 花谢悦神
2 月前
瘦瘦的电池  ·  div中的table内容过多时不超出div的范围解决方法__如果div中的内容过多
2 月前
潇洒的香瓜  ·  阿杰学python----pymysql 动态表名_python mysql 动态表名
2 月前
豪气的感冒药  ·  MySQL :: MySQL Restrictions and Limitations :: 1 Restrictions on Stored Programs
1 月前
气宇轩昂的香瓜  ·  Copy and transform data to and from SQL Server - Azure Data Factory & Azure Synapse | Microsoft Lear
1 月前
威武的茶叶  ·  2023年浦东新区公办小学招生地段公示
5 月前
忐忑的领带  ·  广东省应急管理厅网站
9 月前
鼻子大的人字拖  ·  中纪委:严禁违规参加老乡会校友会意在保护干部_盐城市纪委监委
11 月前
有情有义的小马驹  ·  How to use conditional case with aggregate function - Ask TOM
1 年前
有胆有识的人字拖  ·  :app:generateCrashlyticsSymbolFileRelease - Specified path for unstripped native libs is not a direc
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号