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, 和平.
在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, 和平.