2013-10-18 145 views
0

我有這個問題,我不明白。SQLAlchemy查詢結果爲無

我有SELECT()查詢返回數千行。對於內存問題,我讓它一次返回一個結果行。然後我將結果轉換爲字典。

select_query = select([table1,table2]).where(all_filters) 
res = conn.execute(select_query) 
row = res.fetchone() 
while row is not None: 
    row = res.fetchone() 
    print row is None 

的結果是:

False 
False 
False 
False 
True 

爲什麼它仍然顯示真實的,即使它應該停止時row is None

所以後來當我要創建使用字典:row = dict(zip(row.keys(), row)) 我得到的錯誤:AttributeError: 'NoneType' object has no attribute 'keys'

我是新來的Python,任何幫助,將不勝感激。

回答

1

這不是Python特定的,而是它是任何語言的while循環的屬性。我假設你正在處理循環內的行,因此可以這樣考慮:

row = res.fetchone() 
while row is not None: 
    row = res.fetchone() 
    print row is None 
    processRow(row) 

在最後一次迭代,res.fetchone()回報None,然後將其分配給row,成爲None。然後,在檢查while條件之前執行processRow語句,因此它將評估processRow(None)。在之後只有,在接下來的迭代中,row is not None條件爲假,循環終止。這段代碼沒有任何問題,它正是如何工作的。

一個可能的解決方案是檢查None之前處理,內環路:

for row in res.fetchall(): 
    processRow(row) 

while True: 
    row = res.fetchone() 
    if row is None: 
     break 
    processRow(row) 

或者,如果查詢集是小,你甚至可以用獲取所有這些,過程

+0

我在循環前刪除了'row = res.fetchone()',並添加了第一個解決方案,但在循環的最後打印行返回'None' ... – salamey

+0

是的。用上面的代碼,你需要在循環內部處理事物(我放置一個'processRow'委託)。無論如何,如果你在循環之後執行它,那麼你只會處理最後一行(並丟失所有其他行)。 –

+0

感謝您的時間和精力 – salamey