为什么Python中yield语句在游标下会这样表现?
我有以下代码(我知道怎么让它正常工作并且风格正确,但引用它只是为了问一个问题,想了解哪里出错了):
import MySQLdb
import MySQLdb.cursors
connection = MySQLdb.connect(
host=host, port=port, user=username, passwd=password, db=database,
cursorclass=MySQLdb.cursors.SSCursor)
cursor = connection.cursor()
sql = 'SELECT * FROM EXAMPLE_TABLE'
cursor.execute(sql)
def gen():
yield cursor.fetchmany(5)
for i in gen():
print i
还有第二个例子:
def gen():
yield 'spam'
for i in gen():
print i
# Process finished with exit code 0
我不明白为什么第二个例子只执行一次并且正常结束,而第一个例子却执行了一次后就卡住了,什么也不做。为什么它没有以退出代码0结束呢?
奇怪的行为: 如果在第二个例子中,在循环之前添加以下几行,它也会打印“spam”,然后“卡住”:
connection = MySQLdb.connect(
host=host, port=port, user=username, passwd=password, db=database,
cursorclass=MySQLdb.cursors.SSCursor)
cursor = connection.cursor()
sql = 'SELECT * FROM EXAMPLE_TABLE'
cursor.execute(sql)
更新 回答:Python不会退出程序,直到它的时间连接关闭。
1 个回答
1
我觉得在第一种情况下,你应该这样做:
result = cursor.fetchmany(5)
for item in result:
yield item
fetchmany
方法会获取查询结果的下一组行,并返回一个元组的列表。
当没有更多的行可用时,它会返回一个 空列表
。