Python MySQLdb:遍历游标

6 投票
1 回答
13916 浏览
提问于 2025-04-18 17:32

在另一篇帖子中,这段代码:

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元组,没有进行任何解包。

撰写回答