Python MySQLdb:遍历游标
在另一篇帖子中,这段代码:
connection = MySQLdb.connect(...)
cursor = connection.cursor()
cursor.execute("SHOW TABLES")
for (table_name,) in cursor:
print(table_name)
能够正确地遍历游标中的表名,而这段代码:
for table_name in cursor:
print(table_name)
返回的元素形式是:
('some_table',)
经过多次搜索,我还是搞不明白这个问题。有人能解释一下它们之间的区别吗?我不太明白execute()到底返回了什么。此外,我也搞不清楚第一个迭代器的形式——使用括号和逗号——为什么能正常工作。
1 个回答
13
首先,execute()
这个函数本身并不会返回任何东西。当你执行一个查询后,你可以通过遍历游标来获取查询返回的数据,这些数据会以元组的形式出现。
你的查询只返回了一列数据,所以你得到的是1元组。
在Python中,1元组看起来有点奇怪。()
是一个空元组,而(1, 2)
是一个2元组,但(1)
只是数字1
放在括号里,并不是一个元组。为了让1元组像(1,)
这样被识别为元组,必须在后面加上一个逗号。
如果你执行一个查询,选择了三列数据,你可以用下面的方式读取每一行的三个值:
cursor.execute("SELECT a, b, c FROM some_table")
for (a_value, b_value, c_value) in cursor:
# do stuff...
你的第一段代码做的事情是一样的,但它是在解包1元组,而不是3元组。
另一方面,你的第二段代码只是简单地遍历游标返回的内容,也就是1元组,没有进行任何解包。