如何将带有值和表名的参数化语句传递给Psycopg2?

时间:2012-04-08 05:40:24

标签: python psycopg2

我基本上是想完成回答者在这里指出的内容: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

2 个答案:

答案 0 :(得分:4)

尝试以下操作,db模块应该正确引用:

sql = 'SELECT %s FROM %s WHERE %s' % (pkey, table, field) + ' = %s'
cursor.execute(sql, (value, ))

答案 1 :(得分:4)

你的问题在引用中是不是,而是在Python的元组语法中。

如上所述,表示一个元素元组的正确方法是(value,)。通常,元组语法是(非正式地):

()
(value,)
(value, value)
(value, value, value)

等多元素元组。

接受的答案并不是真正正确的,其中提出的改变纯粹是一种品味问题(替换后的最后'%s'会附加到你的尝试之后)。


记住这一点:在Python中进行常见的字符串替换时,如果只有一个%s的字符串,则可以删除元组并简单地传递单个替换字符串:

'foo %s' % 'bar'

这将导致foo bar

您可以尝试使用psycopg的{​​{1}},也许它可以运行(我会在发布前自行测试,但我不能)。