MySql cursors.execute()仅具有一个参数:为什么将字符串切成列表?
现状:
我有一个带有表的工作数据库,可以查询,插入,更新等。游标也连接到正确的数据库。
桌子:
问题:
当从表中查询数据时,我遇到了麻烦:
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'))
-
问题是这
('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,))