我查询了两个数据库以获得两个关系。我曾经对这些关系进行过一次形成地图,然后再次进行一些计算。但是,当我尝试第二次迭代相同的关系时,我发现实际上没有发生迭代。这是代码:
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_map
和after_map
不为空,因此Relation1
和Relation2
肯定会有元组。但count
和count2
为0,因此prod_row
和before_row
'for循环'实际上并未发生。为什么我不能第二次迭代Relation1
和Relation2
?
答案 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_map
和idct.m
对象之间进行交叉引用。