2013-02-24 56 views
0

我有以下代碼(我知道如何做到這一點的工作,並在合適的款式,而是舉了它作爲一個例子只問一個問題,明白的地方是錯誤的):爲什麼蟒蛇聲明產量這樣的行爲與光標?

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的只要連接時間結束,程序就不會出現在程序中。

+0

這可能是第一個「凍結」,如果cursor.fetchmany(5)恰好是從花費很長的時間,實際運行一個或大或緩慢數據庫拉取一次。你有沒有嘗試只運行cursor.fetchmany(5),看看是否需要一段時間? – 2013-02-24 09:55:06

+0

是的,你是對的。在本地數據庫中的最前一頁的例子給出了一個行中的輸出和退出代碼爲0。但在真正的大表完成(非本地)第一給人以行「凍結」。爲什麼不在他完成工作時結束? – 2013-02-24 10:04:26

回答

1

我想你應該在第一種情況下做什麼是

result = cursor.fetchmany(5) 

for item in result: 
    yield item 

fetchmany方法取出下一集的查詢結果行,返回一個元組列表。

empty list當沒有更多的行可被返回。

+0

問題是有一點不同,爲什麼程序不會在第一種情況下完成工作嗎?預計只有一次通過循環和退出。 – 2013-02-24 09:55:15