Python MySQLdb:迭代游标

时间:2014-08-17 02:06:27

标签: python iterator mysql-python

在另一篇文章中,这段代码:

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 个答案:

答案 0 :(得分:4)

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

相关问题