我想直接從 SQL 陳述句中提取結果表的列名:
query = """
select
sales.order_id as id,
p.product_name,
sum(p.price) as sales_volume
from sales
right join products as p
on sales.product_id=p.product_id
group by id, p.product_name;
"""
column_names = parse_sql(query)
# column_names:
# ['id', 'product_name', 'sales_volume']
知道該怎么做parse_sql()嗎?生成的函式應該能夠識別別名并洗掉表別名/識別符號(例如“sales.”或“p.”)。
提前致謝!
uj5u.com熱心網友回復:
我已經使用庫sqlparse做了類似的事情。基本上,這個庫接受您的 SQL 查詢并將其標記化。完成后,您可以搜索選擇查詢標記并決議底層標記。在代碼中,這看起來像
import sqlparse
def find_selected_columns(query) -> list[str]:
tokens = sqlparse.parse(query)[0].tokens
found_select = False
for token in tokens:
if found_select:
if isinstance(token, sqlparse.sql.IdentifierList):
return [
col.value.split(" ")[-1].strip("`").rpartition('.')[-1]
for col in token.tokens
if isinstance(col, sqlparse.sql.Identifier)
]
else:
found_select = token.match(sqlparse.tokens.Keyword.DML, ["select", "SELECT"])
raise Exception("Could not find a select statement. Weired query :)")
此代碼也適用于使用公用表運算式的查詢,即它只回傳最終選擇列。根據您使用的 SQL 方言和引號字符,您可能需要調整 col.value.split(" ")[-1].strip("`").rpartition('.')[- 1]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/416617.html
標籤:
