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

时间:2015-02-04 01:32:52

标签: python sql-server python-2.7 tuples psycopg2

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

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))

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

1 个答案:

答案 0 :(得分:0)

如果您使用format()并将最终%s设为{},那么您可以按原样保留前四个%s并仅格式化最后一个。

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

它将使所有%s单独留下,但我无法保证它将解决除此之外的任何问题。