MySql cursor.execute() 只有一个参数:为啥要将字符串切片到列表中?
Posted
技术标签:
【中文标题】MySql cursor.execute() 只有一个参数:为啥要将字符串切片到列表中?【英文标题】:MySql cursors.execute() with only one parameter: Why is a string sliced into a list?MySql cursor.execute() 只有一个参数:为什么要将字符串切片到列表中? 【发布时间】:2014-09-08 00:31:44 【问题描述】:现状:
我有一个带有表的工作数据库,可以查询、插入、更新等。游标也连接到正确的数据库。
桌子:
问题:
当涉及到从表中查询数据时,我遇到了麻烦:
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'))
【问题讨论】:
【参考方案1】:问题在于('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 cursor.execute() 只有一个参数:为啥要将字符串切片到列表中?的主要内容,如果未能解决你的问题,请参考以下文章
python连接MySQL数据库问题? cursor( ) 、execute()和fetchall( )方法的作用?
使用 Python 和 mySQL(以及作为操作系统的 windows), cursor.execute() 不返回任何结果,但它正在连接