我基本上试图完成回答者在这里指出的内容:psycopg2 cursor.execute() with SQL query parameter causes syntax error
我的发言是:
cursor.execute('SELECT %s FROM %s WHERE %s = %s' % (pkey,table,field, "%s"), (value))
但是当我运行它时,我得到错误:
---> 89 cur.execute('SELECT %s FROM %s WHERE %s = %s' % (pkey,table,field, "%s"), (value))
90 res=cur.fetchone()
91 if res==None:
TypeError: not all arguments converted during string formatting
你的问题不是引用,而是Python的元组语法。
如上所述,表示单元素元组的正确方法是(value,)
。一般来说,元组语法是(非正式地):
()
(value,)
(value, value)
(value, value, value)
对于多元素元组等等。
接受的答案并不是真正正确的,其中建议的变化纯粹是一种品味问题(在替换后与你的尝试相比,最后'%s'被追加)。
请记住这一点:在Python中进行常见的字符串替换时,如果只有一个%s
的字符串,则可以删除元组并简单地传递单个替换字符串本身:
'foo %s' % 'bar'
这将导致foo bar
。
您可以尝试与psycopg
的cursor.execute
相同,也许它有效(我会在发布之前自己测试,但我不能)。
尝试以下操作,db模块应该正确引用:
sql = 'SELECT %s FROM %s WHERE %s' % (pkey, table, field) + ' = %s'
cursor.execute(sql, (value, ))