我有一个包含表的工作数据库,可以查询,插入,更新等。光标也连接到正确的数据库。
表格:
当从表中查询数据时,我遇到了麻烦:
query = 'SELECT Last_Request_Time FROM Products WHERE idProduct = %s'
idProduct = '106'
cursor.execute(query, (idProduct))
调试时我看一下cursor.execute()函数:params = str: 106
将传递给:
stmt = operation % self._process_params(params)
其中
res = params
# pylint: disable=W0141
res = map(self._connection.converter.to_mysql, res)
使用res = str: 106
调用。我不确定转换器在做什么,但结果是 res = list: ['1', '0', '6']
。并且这些参数将被传递给execute函数,该函数将遇到以下错误:
File "C:\Python27\lib\site-packages\mysql\connector\cursor.py", line 480, in execute
"Wrong number of arguments during string formatting")
mysql.connector.errors.ProgrammingError: Wrong number of arguments during string formatting
我有一个肮脏的解决方法,但我对它不满意。在某些情况下可能不起作用:
query = 'SELECT Last_Request_Time FROM Products WHERE idProduct = %s AND Edition != %s'
idProduct = '106'
cursor.execute(query, (idProduct, 'A'))
答案 0 :(得分:11)
问题是('hello')
是一个字符串而('hello',)
是一个元组。您需要始终将元组(或其他此类集合,如列表)作为占位符的值传递。原因是您的占位符在查询中是位置,因此参数也应该有一些顺序 - 元组和列表是获取有序选择对象的两种方法。
由于期待元组或其他集合,106
会转换为[1, 0, 6]
。如果您传入(106,)
,则会正确解释。
在幕后,这是正在发生的事情:
>>> for i in '106':
... print(i)
...
1
0
6
>>> for i in ('106',):
... print(i)
...
106
所以,你的' hack'实际上是正确的解决方案,你不需要额外的变量:
q = 'SELECT Last_Request_Time FROM Products WHERE idProduct = %s'
cursor.execute(q, (idProduct,))