在另一篇文章中,这段代码:
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()返回的确切内容。此外,我无法弄清楚为什么第一个迭代器的形式 - 使用括号和逗号 - 工作。
答案 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元组,而不进行任何解包。