MySql cursors.execute()只有一个参数:为什么字符串被切成一个列表?

Rap*_*pel 7 python mysql python-2.7 mysql-connector-python

现状:

我有一个带表的工作数据库,可以查询,插入,更新等.光标也连接到正确的数据库.

桌子:

查询结果的屏幕截图

问题:

当从表中查询数据时遇到麻烦:

query     = 'SELECT Last_Request_Time FROM Products WHERE idProduct = %s'
idProduct = '106'
cursor.execute(query, (idProduct))
Run Code Online (Sandbox Code Playgroud)

在调试时我看一下cursor.execute()函数:params = str: 106将传递给:

stmt = operation % self._process_params(params)
Run Code Online (Sandbox Code Playgroud)

哪里

res = params
# pylint: disable=W0141
res = map(self._connection.converter.to_mysql, res)
Run Code Online (Sandbox Code Playgroud)

被称为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
Run Code Online (Sandbox Code Playgroud)

解决方法不好:

我有一个肮脏的解决方法,但我不满意.在某些情况下可能不起作用:

query     = 'SELECT Last_Request_Time FROM Products WHERE idProduct = %s AND Edition != %s'
idProduct = '106'
cursor.execute(query, (idProduct, 'A'))
Run Code Online (Sandbox Code Playgroud)

Bur*_*lid 11

问题是这('hello')是一个字符串,('hello',)是一个元组.您需要始终将元组(或其他此类集合,如列表)作为占位符的值传递.原因是你的占位符在你的查询中是位置的,所以参数也应该有一些顺序 - 元组和列表是获得有序选择对象的两种方法.

由于它期望一个元组或其他集合,106转换为[1, 0, 6].如果你传入(106,),它将被正确解释.

在幕后,这是正在发生的事情:

>>> for i in '106':
...     print(i)
...
1
0
6
>>> for i in ('106',):
...    print(i)
...
106
Run Code Online (Sandbox Code Playgroud)

所以,你的'hack'实际上是正确的解决方案,你只需要额外的变量:

q = 'SELECT Last_Request_Time FROM Products WHERE idProduct = %s'
cursor.execute(q, (idProduct,))
Run Code Online (Sandbox Code Playgroud)