这是一段导致我麻烦的代码
def process_message( msg):
# deserialize msg
id_dict = json.loads(msg)
# extract id
report_id = id_dict['id']
print report_id
sql = """ select r.id,
format('DATA "the_geom from (%s) as subquery
using unique gid using srid=4326"', 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;"""
args = ('%s','%s','%s','%s','%s')
cursor.execute(sql, args)
row = cursor.fetchone()
(id,data,rcode,validation) = row
print (id,data,rcode,validation)
exit
运行代码时,这是出现的错误消息
Traceback (most recent call last):
File "mapfile_queue_processor.py", line 60, in <module>
process_message( content )
File "mapfile_queue_processor.py", line 41, in process_message
cursor.execute(sql, args)
psycopg2.ProgrammingError: type "s" does not exist
LINE 2: format('DATA "the_geom from ('%s') as subquery
^
现在我根据人们之前的建议尝试了一些不同的修复,但没有一个正在运行。
在sql变量中,我尝试将所有%s
设置为%%s
和'%s'
以及'%%s'
和"%s"
以及{{ 1}}甚至到"%%s"
的地狱
我似乎找到的唯一可能的解决方案是我不能拥有{s}
而我需要有实际的参数而不是args = ('%s','%s','%s','%s','%s')
这是解决我问题的方法吗? 如果是这样,我该如何解决呢?
如果不是解决方案,我该如何解决?
答案 0 :(得分:0)
cursor.execute()中的args
参数应该是您传递给查询的真实参数(它们将取代%s
占位符)。
答案 1 :(得分:0)
在cursor.execute()
中,您的参数应包含您要在查询中替换的真实参数(值),而不是&#39;%s&#39;。正如said in the documentation:
Psycopg按类型将Python变量强制转换为SQL文字。许多标准Python类型已经适应了正确的SQL表示。
示例:Python函数调用:
>>> cur.execute(
... """INSERT INTO some_table (an_int, a_date, a_string)
... VALUES (%s, %s, %s);""",
... (10, datetime.date(2005, 11, 18), "O'Reilly"))
转换为SQL命令:
INSERT INTO some_table (an_int, a_date, a_string)
VALUES (10, '2005-11-18', 'O''Reilly');
使用%(name)的占位符也支持命名参数。使用命名参数,可以按任何顺序将值传递给查询,并且许多占位符可以使用相同的值:
>>> cur.execute(
... """INSERT INTO some_table (an_int, a_date, another_date, a_string)
... VALUES (%(int)s, %(date)s, %(date)s, %(str)s);""",
... {'int': 10, 'str': "O'Reilly", 'date': datetime.date(2005, 11, 18)})
答案 2 :(得分:0)
我认为您不能使用参数绑定(即由psycopg处理的'%s')在引用的内部查询中执行占位符替换。您将不得不自己构建一些查询字符串,转义您希望在查询中逐字逐句结束的每个'%'。
sql = "select 'Hello, %s' from bobs where id = %%s" % ("Bob",)
cursor.execute( sql, [123] )
显然你需要清理你的参数 - 我认为psycopg有一些可用的功能。