前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用sqlparse库解析 SQL语句

使用sqlparse库解析 SQL语句

原创
作者头像
yuezht
发布2023-03-28 14:17:57
3K1
发布2023-03-28 14:17:57
举报
文章被收录于专栏:数据库技术日积月累

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

代码语言:javascript
复制
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):
            condition = token.tokens[4].value
            break
    else:
        condition = None

    return {'table': table, 'condition': condition}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档