相关文章推荐
不羁的四季豆  ·  IVsDataTableColumn 接口 ...·  1 月前    · 
善良的手电筒  ·  山西姐妹花豪门出身,背靠金道铭无人敢惹,狂赚 ...·  2 年前    · 
飞奔的生姜  ·  白云山(00874.HK):收到药品再注册批 ...·  2 年前    · 
聪明伶俐的人字拖  ·  埃安20222年1-10月累计销量达到212 ...·  2 年前    · 
慷慨的黄豆  ·  《北京女子图鉴之整容大师》:离婚是一个决定 ...·  2 年前    · 
天涯  ·  关于库存周转天数计算方式的讨论 - 知乎·  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):
 
推荐文章
不羁的四季豆  ·  IVsDataTableColumn 接口 (Microsoft.VisualStudio.Data.Services.RelationalObjectModel) | Microsoft Learn
1 月前
善良的手电筒  ·  山西姐妹花豪门出身,背靠金道铭无人敢惹,狂赚十几亿后下场凄凉|胡昕|太原|山西省_网易订阅
2 年前
飞奔的生姜  ·  白云山(00874.HK):收到药品再注册批准通知书_新浪财经_新浪网
2 年前
聪明伶俐的人字拖  ·  埃安20222年1-10月累计销量达到212,384辆,同比增长134%-华夏EV网
2 年前
慷慨的黄豆  ·  《北京女子图鉴之整容大师》:离婚是一个决定 - 知乎
2 年前
天涯  ·  关于库存周转天数计算方式的讨论 - 知乎
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号