例如,如果我有以下代码:
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
占位符由数据库替换。
最后%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))
它给了我一个超出范围错误的元组索引,这让我回到了我开始的方块
答案 0 :(得分:0)
如果您使用format()并将最终%s
设为{}
,那么您可以按原样保留前四个%s
并仅格式化最后一个。
sql = """[sql stuff and %s]{}""".format(report_id)
它将使所有%s
单独留下,但我无法保证它将解决除此之外的任何问题。