【发布时间】:2013-02-09 14:57:05
【问题描述】:
我有以下代码(我知道如何以正确的方式执行此操作,但引用它作为示例只是为了提出问题并了解错误在哪里):
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?
奇怪的行为: 如果在第二个示例中在循环之前添加以下行,它也会打印“垃圾邮件”和“冻结”:
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只要连接关闭就不会退出程序。
【问题讨论】:
-
如果 cursor.fetchmany(5) 碰巧从一个需要很长时间才能实际运行一次提取的大型或慢速数据库中提取,则第一个可能会“冻结”。您是否尝试过单独运行 cursor.fetchmany(5) 并查看是否需要一段时间?
-
是的,你是对的。在本地数据库上,第一个示例在输出中给出一行并以退出代码 0 结束。但在真正的大表(非本地)上,第一个示例给出一行并“冻结”。为什么不等他做完工作就结束?
标签: python cursor mysql-python yield