相关文章推荐
豪爽的热水瓶  ·  How to export a Hive ...·  3 周前    · 
留胡子的红薯  ·  Visual Studio ...·  2 月前    · 
慷慨的包子  ·  副总理刘鹤出席发言,高层对人工智能作出重要研 ...·  1 年前    · 
卖萌的米饭  ·  python如何推送消息到QQ或者微信? - 知乎·  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):
 
推荐文章
豪爽的热水瓶  ·  How to export a Hive table into a CSV file? - Stack Overflow
3 周前
留胡子的红薯  ·  Visual Studio 容器工具的错误代码 - Visual Studio (Windows) | Microsoft Learn
2 月前
慷慨的包子  ·  副总理刘鹤出席发言,高层对人工智能作出重要研判,“颠覆性的变化”已经显现.... 副总理刘鹤出席发言,高层对人工智能作出重要研判,“颠覆性的变化”已经显现....以下文章来源于潇湘经略 ,作者潇湘来源
1 年前
卖萌的米饭  ·  python如何推送消息到QQ或者微信? - 知乎
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号