使用 psycopg2 sql 调用格式化 Python 字典对象

问题描述 投票:0回答:1

我正在使用一个 python 工作流,该工作流进行频繁的 SQL 调用,SQL 调用存储在独立文件中,并使用

psycopg2
标识符进行格式化。我正在尝试使用字典对象修改这些调用,但无法正确格式化 SQL 调用。

一个 SQL 文件的示例头是:

with my_table as (
  SELECT DISTINCT ON ("column_A")
    left_table."column_b",
    left_table."column_c",
    {column_identifier}
    ...

在我的 Python 脚本中,我调用以下内容:

col_info = my_dictionary.entry
column_identifier = " ".join([f'left_table."{x}",' for x in col_info])

这看起来完全正确,但如果我把它包括在电话中

sql_call = py2.sql.SQL(sql).format(
  column_identifier=py2.sql.Identifier(column_identifier),
  ...
  )

我收到格式错误,其中已解析的列都如下所示:

"left_table.""column_d"", "

如果我使用

Literal
而不是
Identifier
,则 SQL 调用会进行交易,但会产生无意义的输出。我不能使用
AsIs
因为其他
Identifier
呼叫被使用。

到目前为止,我看到的唯一可能的解决方案是整个 SQL 调用都包含在

f""" ... """
中,但由于有多个长 SQL 调用,将它们全部包含在 Python 脚本中将非常笨拙。能够格式化这些简单的行将是一个非常可取的解决方案。

谢谢

python sql psycopg2
1个回答
0
投票

我认为你正在寻找的草稿:

import psycopg2
from psycopg2 import sql
con = psycopg2.connect("dbname=test host=localhost  user=aklaver")

left_table = 'left_tbl'
table_name = 'some_tbl'
column_list = ['a', 'b', 'c']


q = sql.SQL("SELECT {} FROM {} JOIN {} ...").format(sql.SQL(', ').join(
            [sql.Identifier(left_table, col)  for col in column_list]),
            sql.Identifier(left_table), sql.Identifier(table_name))
print(q.as_string(con))

SELECT "left_tbl"."a", "left_tbl"."b", "left_tbl"."c" FROM "left_tbl" JOIN "some_tbl" ...

© www.soinside.com 2019 - 2024. All rights reserved.