为什么python语句在使用游标时会有这种行为?

为什么python语句在使用游标时会有这种行为?,python,cursor,mysql-python,yield,Python,Cursor,Mysql Python,Yield,我有以下代码,我知道如何以正确的方式执行此操作,但引用它作为示例只是为了问一个问题并了解错误在哪里: 导入MySQLdb 导入MySQLdb.cursors connection=MySQLdb.connect host=host,port=port,user=username,passwd=password,db=database, cursorclass=MySQLdb.cursors.SSCursor cursor=connection.cursor sql='从示例_表中选择* curs

我有以下代码,我知道如何以正确的方式执行此操作,但引用它作为示例只是为了问一个问题并了解错误在哪里:

导入MySQLdb 导入MySQLdb.cursors connection=MySQLdb.connect host=host,port=port,user=username,passwd=password,db=database, cursorclass=MySQLdb.cursors.SSCursor cursor=connection.cursor sql='从示例_表中选择* cursor.executesql def gen: 1.fetchmany5 对于gen中的i: 打印i 第二:

def gen: 产生“垃圾邮件” 对于gen中的i: 打印i 进程已完成,退出代码为0 我不明白为什么第二个例子只执行了一次就结束了,但是第一个例子执行了一次就停止了,什么也不做。他为什么不停止使用退出代码0

奇怪的行为: 如果在第二个示例中,在循环之前添加以下行,则它会打印“垃圾邮件”并冻结:

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就不会出现在程序中。

我认为在第一种情况下您应该做的是

result = cursor.fetchmany(5)

for item in result:
    yield item
fetchmany方法获取查询结果的下一组行,返回元组列表


当没有更多行可用时,将返回空列表

如果cursor.fetchmany5恰好从一个大的或速度慢的数据库中提取,并且实际运行一次fetch需要很长时间,则第一个数据库可能会冻结。您是否尝试过自己运行cursor.fetchmany5,看看是否需要一段时间?是的,您是对的。在本地数据库上,第一个示例在输出中给出一行,并以退出代码0结束。但是在真正的大桌子上,不是本地的,第一张桌子会发出一声响声,然后冻结。为什么不在他完成工作的时候结束呢?问题有点不同,为什么程序在第一种情况下没有完成工作?预期只有一次通过循环并退出。