2016-01-04 104 views
0

我查詢兩個數據庫以獲得兩個關係。我對這些關係進行過一次形成地圖的演練,然後再進行一些計算。但是,當我第二次嘗試迭代相同的關係時,我發現實際上沒有發生迭代。下面是代碼:多次對錶進行迭代Python SQLAlchemy

dev_connect = dev_engine.connect() 
prod_connect = prod_engine.connect() # from a different database 
Relation1 = dev_engine.execute(sqlquery1) 
Relation2 = prod_engine.execute(sqlquery) 

before_map = {} 
after_map = {} 
for row in Relation1: 
    before_map[row['instrument_id']] = row 
for row2 in Relation2: 
    after_map[row2['instrument_id']] = row2 

update_count = insert_count = delete_count = 0 

change_list = [] 
count =0 
for prod_row in Relation2: 
    count += 1 
    result = list(prod_row) 
    ... 
    change_list.append(result) 

count2 = 0 
for before_row in Relation1: 
    count2 += 1 
    result = before_row 
    ... 

print count, count2 # prints 0 

before_mapafter_map不是空的,所以Relation1Relation2肯定有他們的元組。然而,countcount2爲0,所以prod_rowbefore_row'for循環'實際上並未發生。爲什麼我不能第二次迭代Relation1Relation2

回答

1

當您在SQL Alchemy引擎上調用execute時,您會收到一個ResultProxy,這是DBAPI遊標到您的查詢返回的行的外觀。

返回的結果是:

一旦你遍歷ResultProxy的所有結果,所以你不能僅僅通過遍歷它再次使用的結果,因爲documented on the SQLAlchemy page自動關閉的根本指針ResultProxy的實例,它引用了一個DBAPI遊標,並提供了一個與遊標光標基本兼容的界面。當所有結果行(如果有)用盡時,DBAPI遊標將被ResultProxy關閉。

你能解決你的問題了幾個方面:

  • 商店在list結果。只要做對行的list -comprehension返回:

    Relation1 = dev_engine.execute(sqlquery1) 
    relation1_items = [r for r in Relation1] 
    # ... 
    # now you can iterate over relation1_items as much as you want 
    
  • 你通過返回的每一行集需要在一次通過的一切。我不知道這個選項對您是否可行,因爲我不知道您的計算的全部範圍是否需要在您的before_mapafter_map對象之間進行交叉引用。

+0

有沒有辦法重新打開遊標? –

+0

@JeremyFisher - 據我所知,SQL Alchemy/DBAPI不支持[可滾動遊標](https://en.wikipedia.org/wiki/Cursor_%28databases%29#Scrollable_cursors),所以你的光標回來是一次使用而忘記的交易。 – birryree