【无标题】

# -*- coding: utf-8 -*-
# @Time    : 2022/3/9 20:44
# @Author  : wanged
# @File    : test.py
# @Desc    :

from sqlparser import parse_statement
from sqlparser.utils import print_tree
from antlr4 import ParserRuleContext
import re

sql1 = 'insert into db1.table0 select t1.name, t1.age, t2.gender, t2.address from db1.table1 t1 join db1.table2 t2 on t1.id=t2.id'
sql2 = """
with cte1 as (select id, name from db.table1 where name like 'abc%'), cte2 as (select id, age, gender from db.table2 where id > 20), cte3 as (select id, address from db.table3) insert into db.result select a.name, b.age, b.gender, c.address from cte1 a, cte2 b, cte3 c where a.id = b.id and a.id = c.id
"""


tb_list = []


def get_table_position(sql, node):
    if isinstance(node, ParserRuleContext):
        class_name = str(type(node))
        if str(class_name) == "<class 'sqlparser.generated.SqlBaseParser.SqlBaseParser.NamedQueryContext'>":
            tb_list.append(
                sql[int(re.split(r'[,:]', str(node.start))[1]):int(re.split(r'[:=]', str(node.start))[1]) + 1])

            return tb_list
    if hasattr(node, 'children') and getattr(node, 'children'):
        for child in getattr(node, 'children'):
            get_table_position(sql, child)
    return tb_list

tree = parse_statement(sql2)
get_table_position(sql2, tree)
print(tb_list)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值