当前位置: 首页 > 面试题库 >

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

燕和裕
2023-03-14
问题内容

现状:

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

桌子:

查询结果的屏幕截图

问题:

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

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


 类似资料:
  • 下面的代码分别调用两个简单的函数100亿次。 我的假设是这两个调用的性能几乎相同。如果有的话,我会猜到传递两个参数会比传递一个稍微慢一些。鉴于所有参数都是对象引用,我并不期望其中一个参数是列表这一事实会产生任何差异。 我运行了多次测试,一个典型的结果是“12781/30536”。换句话说,使用两个字符串的调用需要13秒,使用列表的调用需要30秒。 更新 这不是一个公平的测试,原因很多。然而,它确实

  • 问题内容: 如何将Go语言中的一个字符串切成包含的字符串字母数组? 例如,将字符串“ abc”转换为数组“ a”,“ b”,“ c”。 问题答案: 例如,使用转换为符文 操场 输出: 从链接: 将字符串类型的值转换为符文类型的切片会产生一个切片,其中包含字符串的各个Unicode代码点。如果字符串为空,则结果为[] rune(nil)。

  • 假设我有以下数组列表: 并且必须遵守规则: 从数组列表 1 开始,我想形成新的以下数组列表: <李>猫狗 <李>鼠蛇 无论如何都可以这样做。我目前还没有找到任何字符串到字符串转换的内容。

  • 问题内容: Oracle Java Community网站上的一篇文章提供了以下方法作为示例(对于JPA Converter,但这并不相关): 将String y强制转换为String val有什么用?有正当的理由吗? 原始文章:JPA的新增功能 问题答案: 这样的转换是完全没有必要的。我可以想象那是以前 但是后来参数类型更改为,而作者只是忘了删除强制类型转换。

  • 我对任何编程都非常陌生,所以请原谅我的无知,因为我不知道如何做一些看起来很简单的事情。 我所要做的就是获取任何字符串数组(称之为名称),比如: 并将其从列表中删除,并将其转换为字符串: 我似乎无法理解这一点,也找不到类似的帖子。

  • 问题内容: 我对Regex的经验不足,但是我已经阅读了很多。假设有一个字符串,我想要一个列表,该列表的字符串分为两个部分。我的方法是让一个小组检查是否是数字,然后检查该小组是否重复。像这样 我认为基本上可以检查“ digit”或“ digit +”是否相同。我认为这可以满足我的要求。 问题答案: 用途: