添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
# ['id', 'product_name', 'sales_volume']

有什么想法在 parse_sql() 中做什么?产生的函数应该能够识别别名,并删除表的别名/标识(例如 "sales. "或 "p.")。

提前感谢!

1 个评论
You could try the python-sqlparse 图书馆。
python
sql
parsing
extract
Hein Schnell
Hein Schnell
发布于 2022-01-18
2 个回答
Simon Hawe
Simon Hawe
发布于 2022-04-30
已采纳
0 人赞同

我已经用库做了类似的事情 语法分析法(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]这一行。

很好,这正是我所寻找的。非常感谢!我知道sqlparse,但不知道如何正确利用它。
Toby Mao
Toby Mao
发布于 2022-04-30
0 人赞同

Try out SQLGlot

它比sqlparse简单得多,而且不容易出错。

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"))