仅使用 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
保持独立,但我不能保证它会解决除此之外的任何问题。
例如,如果我有以下代码:
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
保持独立,但我不能保证它会解决除此之外的任何问题。