类型错误:'int'对象不可迭代 - Python

8

我收到了以下错误:

  File "/home/ec2-user/test/test_stats.py", line 43, in get_test_ids_for_id
    cursor.execute("""select test_id from test_logs where id = %s """, (id))
  File "/home/ec2-user/.etl/lib/python2.7/site-packages/MySQLdb/cursors.py", line 187, in execute
    query = query % tuple([db.literal(item) for item in args])
TypeError: 'int' object is not iterable

这是我代码的一个问题段落:

这是我遇到困难的代码部分:

def get_test_ids_for_id(prod_mysql_conn, id):
    cursor = prod_mysql_conn.cursor()
    cursor.execute("""select test_id from test_logs where id = %s """, (id))
    rows = cursor.fetchall()
    test_ids = []
    for row in rows:
      test_ids.append(row[0])
    return test_ids

2
应该是 cursor.execute(..., (id,)) - 注意末尾的逗号,这使它成为一个元组。 - jonrsharpe
@jonrsharpe,你能清楚地解释一下吗? - Brisi
Martijn已经有了!请参见http://stackoverflow.com/q/22460082/3001761 - jonrsharpe
1
你好,请试着这样做:[id] - Prashant
2个回答

26

您需要给cursor.execute一个元组,但您只给了一个整数:

(id)

添加逗号使其成为元组:

(id,)

完整的代码行应该是:

cursor.execute("""select test_id from test_logs where id = %s """, (id,))

将表达式放在括号中只是“分组”该单个表达式。是逗号使其成为元组:

>>> (42)
42
>>> (42,)
(42,)

任何可迭代对象都可以,所以您也可以使用[...]括号:

cursor.execute("""select test_id from test_logs where id = %s """, [id])

非常烦人的是处理这个。 - briankip
@briankip:为什么这很烦人?这是基本语法;编程语言一直在不同的上下文中使用相同的符号表示不同的含义。逗号用于元组和函数签名中分隔不同参数,或在类定义中分隔基类,或在调用表达式中分隔参数,或列表中分隔值等。因为有时需要区分元组和其他含义,所以需要在元组周围使用括号来消除歧义。但仍然是逗号使某些东西成为元组。 - Martijn Pieters
1
@briankip:这不是特定于MySQLdb的。它在所有Python数据库适配器中都很常见;它们都遵循Python数据库API规范。 (https://www.python.org/dev/peps/pep-0249/) - Martijn Pieters
1
@briankip:它的工作方式类似于带参数的普通函数。cursor.execute() 函数的第二个参数是查询参数参数。它是一个单一对象,包含所有参数的值。如果您只有一个参数,那么是一个单元素元组。对于2个或更多个参数,您可以在该对象中获得2个或更多个值。它可以是元组或列表。 - Martijn Pieters
1
如果您使用命名参数,则需要使用映射(字典),其中参数名称作为键。 - Martijn Pieters
显示剩余4条评论

0
基本上发生的情况是,当您在查询中传递参数时,它不会成为可迭代对象,因为它是在括号中传递的。为了使其可迭代,您需要将其转换为列表或元组形式。因此,您可以在末尾添加逗号(1,)或将其转换为列表[1]。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接