python解析sql_解析SQL以使用python提取列和表名

importitertoolsimportsqlparsefromsqlparse.sqlimportIdentifierList,Identifierfromsqlparse.tokensimportKeyword,DMLdefis_subselect(parsed):ifnotparsed.is_group():returnFalseforiteminparsed.tokens:ifitem.ttypeisDMLanditem.value.upper()=='SELECT':returnTruereturnFalsedefextract_from_part(parsed):from_seen=Falseprint'hi'foriteminparsed.tokens:ifitem.is_group():print'group'forxinextract_from_part(item):yieldxiffrom_seen:print'from'ifis_subselect(item):forxinextract_from_part(item):yieldxelifitem.ttypeisKeywordanditem.value.upper()in['ORDER','GROUP','BY','HAVING']:from_seen=FalseStopIterationelse:yielditemifitem.ttypeisKeywordanditem.value.upper()=='FROM':from_seen=Truedefextract_table_identifiers(token_stream):foritemintoken_stream:ifisinstance(item,IdentifierList):foridentifierinitem.get_identifiers():value=identifier.value.replace('"','').lower()yieldvalueelifisinstance(item,Identifier):value=item.value.replace('"','').lower()yieldvaluedefextract_tables(sql):# let's handle multiple statements in one sql stringextracted_tables=[]statements=(sqlparse.parse(sql))forstatementinstatements:# print statement.get_type()ifstatement.get_type()!='UNKNOWN':stream=extract_from_part(statement)printstream

extracted_tables.append(set(list(extract_table_identifiers(stream))))returnlist(itertools.chain(*extracted_tables))# strsql = """# SELECT p.product_name, inventory.quantity# FROM products p join inventory# ON p.product_id = inventory.product_id;# """strsql="""SELECT suppliers.supplier_name, subquery1.total_amt

FROM suppliers

,

(SELECT supplier_id, SUM(orders.amount) AS total_amt

FROM orders

GROUP BY supplier_id) subquery1

WHERE subquery1.supplier_id = suppliers.supplier_id;"""extract_tables(strsql)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值