我正在使用一个 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 脚本中将非常笨拙。能够格式化这些简单的行将是一个非常可取的解决方案。
谢谢
我认为你正在寻找的草稿:
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" ...