仅使用 cursor.execute() 替换单个占位符

Replacing single placeholder only using cursor.execute()

例如,如果我有以下代码:

sql = """ select  r.id,
            format('DATA "(%s)"',
            replace(replace(sql,'<<','%'),'>>','%')) as data,
            rcode,
            format('  VALIDATION
            ''userid'' ''^\d+$''%s END',
            string_agg(format ('    ''%s'' ''%s''', paramname,prompt[1]),' ')) as validation
FROM report.reports r
JOIN report.reportparams rp on r.id = rp.reportid and not rp.del
where r.id = %s
group by r.id, sql, rcode;"""

前四个 %s 占位符被数据库替换。 LAST %s 是此代码需要传递的唯一变量。

%s 需要成为之前在代码中指定的变量 report_id。

我最初的想法是用 sql 变量中的 report_id 替换最后一个“%s”,这样代码行现在看起来像:

where r.id = report_id

除了给我一个错误,说变量 report_id 不存在。

sql 变量后的下一行代码是:

cursor.execute(sql)

如果我手动更改 sql 部分,使最后的 %s 是一个实际数字(就像它应该的那样),代码就会执行。

如何 运行 cursor.execute() 行使得最后一个 %s 被变量 report_id 替换,而前 4 %s留给数据库替换。

注意:我尝试通过 运行 将前 4 个 %s 替换为另一个 %s

cursor.execute(sql,(%s,%s,%s,%s,report_id))

但是由于显而易见的原因,这不起作用。它给了我无效的语法错误

另外,如果我将行更改为:

cursor.execute(sql,('%s','%s','%s','%s',report_id))

它给了我一个元组索引超出范围的错误,这让我回到了开始的地方

如果您使用 format() 并将最后一个 %s 设为 {},那么您可以保持前四个 %s 不变,只格式化最后一个。

sql = """[sql stuff and %s]{}""".format(report_id)

它会让所有 %s 保持独立,但我不能保证它会解决除此之外的任何问题。