【问题标题】:Why does python statement yield behave this way with cursor?为什么python语句yield对游标有这种行为?
【发布时间】: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


【解决方案1】:

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

result = cursor.fetchmany(5)

for item in result:
    yield item

fetchmany 方法获取查询结果的下一组行,返回一个元组列表。

当没有更多行可用时返回empty list

【讨论】:

  • 问题有点不同,为什么程序在第一种情况下没有完成工作?预计只有一次通过循环并退出。
猜你喜欢
  • 2018-06-19
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多