Python/MySQL execute in for gives error:- TypeError: 'int' object is not iterable

Python/MySQL execute in for gives error:- TypeError: 'int' object is not iterable

在for循环中执行游标时出现以下错误。

Traceback (most recent call last):
  File "mysql_select_query.py", line 35, in <module>
    for row in cur.execute(sql_select):
TypeError: 'int' object is not iterable

这是我给出错误的代码:

sql_select = "SELECT * FROM T_EMP"
for row in cur.execute(sql_select):
    print("{}, {}, {}, {}".format(row[0], row[1], row[2], row[3]))

当我执行和使用 fetchall() 时效果很好:

sql_select = "SELECT * FROM T_EMP where ID>%s"
rows = cur.execute(sql_select, [0])
for row in cur.fetchall() :
    print("{}, {}, {}, {}".format(row[0], row[1], row[2], row[3]))

我的 MySQL table 架构:

mysql> desc T_EMP;
+------------+-------------+------+-----+-------------------+----------------+
| Field      | Type        | Null | Key | Default           | Extra          |
+------------+-------------+------+-----+-------------------+----------------+
| ID         | int(11)     | NO   | PRI | NULL              | auto_increment |
| CREATED    | timestamp   | NO   |     | CURRENT_TIMESTAMP |                |
| EMP_CODE   | varchar(20) | YES  |     | NULL              |                |
| USER_ID    | int(11)     | YES  |     | NULL              |                |
| FIRST_NAME | varchar(50) | NO   |     | NULL              |                |
| LAST_NAME  | varchar(50) | NO   |     | NULL              |                |
| DEPT_ID    | int(11)     | YES  |     | NULL              |                |
| ADDR_ID    | int(11)     | YES  |     | NULL              |                |
+------------+-------------+------+-----+-------------------+----------------+
8 rows in set (0.00 sec)

如有线索,不胜感激。

谢谢。

PyMySQL Cursor.execute returns an int, i.e. a number that tells the number of lines affected. It doesn't match the behaviour of MySQLConnector/Python,当然你不能使用 for 循环遍历单个数字。

像另一个例子一样使用fetchall

sql_select = "SELECT * FROM T_EMP"
cur.execute(sql_select)
for row in cur.fetchall():
    print("{}, {}, {}, {}".format(row[0], row[1], row[2], row[3]))

或者从游标开始逐行迭代:

sql_select = "SELECT * FROM T_EMP"
cur.execute(sql_select)
for row in cur:
    print("{}, {}, {}, {}".format(row[0], row[1], row[2], row[3]))

另请注意,DBAPI 要求您为每个查询创建一个新游标,即

cur = connection.cursor()

在每个 cur.execute.

之前

你所做的从根本上是错误的:

1- SELECT 声明 returns 数据原样,但函数 cur.execute() returns 迭代器是一个整数,然后在 row[0], row[1], row[2], row[3] 好像可以迭代(显然不能用于简单整数,没有第一个索引,第二个索引,第三个索引,第四个索引)

2- 另一个函数 cur.fetchall() 等于 SELECT * FROM table 但更复杂,因为它与此游标 cur 尚未使用的数据同步,并且对你有用的代码不是下面的部分(不是 100% 肯定所以通过注释掉其他两行来测试)

for row in cur.fetchall() :
    print("{}, {}, {}, {}".format(row[0], row[1], row[2], row[3]))

所以,最好的答案是知道上面写的是什么,然后回到 "classroom" 如果你明白我的意思,或者至少阅读如何使用 python 游标 class, 和平.