迭代表多次Python SQLAlchemy

时间:2016-01-04 17:19:51

标签: 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 个答案:

答案 0 :(得分:2)

当您在SQL Alchemy引擎上调用execute时,会返回ResultProxy,它是查询返回的行的DBAPI光标的外观。

迭代ResultProxy的所有结果后,它会自动关闭基础游标,因此您只能通过迭代结果再次使用结果,如documented on the SQLAlchemy page

  

返回的结果是ResultProxy的实例,它引用DBAPI游标并提供与DBAPI游标大致兼容的接口。当DBAPI所有结果行(如果有的话)都用完时,ResultProxy光标将被list关闭。

您可以通过以下几种方式解决问题:

  • 将结果存储在list中。只需对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_map
  • 在一次通过返回的每一行中,执行您需要的所有操作。我不知道这个选项对您是否可行,因为我不知道您的计算的全部范围是否需要在after_mapidct.m对象之间进行交叉引用。