首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Python从SQL查询中提取列名

如何使用Python从SQL查询中提取列名
EN

Stack Overflow用户
提问于 2022-01-17 17:24:33
回答 2查看 1.2K关注 0票数 2

我想直接从SQL语句中提取出结果表的列名:

代码语言:javascript
运行
复制
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.")。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-17 17:35:12

我使用库平方解析做了类似的事情。基本上,这个库接受您的SQL查询并将其标记化。完成之后,您可以搜索select查询令牌并解析底层令牌。在代码中,这读起来像

代码语言:javascript
运行
复制
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 :)")

此代码也适用于具有公共表表达式的查询,即它只返回最终的select列。根据您正在使用的SQL方言和引号,您可能必须修改行col.value.split(“”)-1.条带(“`”).rpartition(‘.’)-1

票数 4
EN

Stack Overflow用户

发布于 2022-04-30 05:58:03

尝试SQLGlot

它比sqlparse更容易出错,也更容易出错。

代码语言:javascript
运行
复制
import sqlglot
import sqlglot.expressions as exp

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 = []

for expression in sqlglot.parse_one(query).find(exp.Select).args["expressions"]:
    if isinstance(expression, exp.Alias):
        column_names.append(expression.text("alias"))
    elif isinstance(expression, exp.Column):
        column_names.append(expression.text("this"))

print(column_names)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70745252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档