Python / MySQL执行for给出错误: - TypeError:'int'对象不可迭代

时间:2017-11-10 19:18:00

标签: python mysql pymysql

当我在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]))

当我执行&amp;使用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表架构:

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)

任何线索都很感激。

感谢。

2 个答案:

答案 0 :(得分:0)

PyMySQL Cursor.execute返回 int ,即一个告诉受影响的行数的数字。它与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 :(得分:0)

你所做的事情根本就是错误的:

1- SELECT语句按原样返回数据,但函数cur.execute()返回迭代器,它是一个整数,然后在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]))

所以,最好的答案是知道上面写的是什么,然后回到&#34;教室&#34;如果你知道我的意思,或者至少阅读如何使用python游戏类,那就是和平。