gpt4 book ai didi

python - MySql cursors.execute() 只有一个参数 : Why is a string sliced into a list?

转载 作者:太空狗 更新时间:2023-10-29 21:31:37 26 4
gpt4 key购买 nike

现状:

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

表格:

screenshot of query result

问题:

当涉及到从表中查询数据时,我遇到了麻烦:

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']。这些参数将传递给执行函数,该函数将遇到以下错误:

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,))

关于python - MySql cursors.execute() 只有一个参数 : Why is a string sliced into a list?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24798411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com