2014-01-22 88 views
0

获得了一个嵌套循环,其内部循环是sqlalchemy结果代理对象。我的问题是,当外部循环的第二次迭代被实例化并追溯到迭代resultproxy对象时,脚本错误循环访问结果代理对象

sqlalchemy.exc.ResourceClosedError: This result object is closed. 

这里是我的代码存在。当X> 0时,内部循环失败:

tbl = Table('users', self.meta, autoload=True, autoload_with=Engine) 
stmt = select([tbl.c.id, tbl.c.name]) 
result = self.CONN.execute(stmt) 
for x in range(2): 
    for row in result: 
     print(row[tbl.c.id]) 

回答

1

您正在耗尽第一个内部循环本身的连接。尝试复制并将其存储在列表中:

tbl = Table('users', self.meta, autoload=True, autoload_with=Engine) 
stmt = select([tbl.c.id, tbl.c.name]) 
result = self.CONN.execute(stmt) 
ids = [row[tbl.c.id] for row in result] 
for x in range(2): 
    for i in ids: 
     print(i) 
+0

但是为什么?假设我没有一个结果代理对象,因为我在内部循环中有'for range in(5)'作为内部循环,所以我希望它可以一直迭代而不会出错。为什么结果代理对象不同?是维护与数据库的连接的结果代理对象,以便它在1次迭代后耗尽?我不明白。 – lukik

+0

'result'是指向结果中的一行的数据库游标的代理。在内部循环结束时,它指向最后一行之后。因此,要返回,您需要将该光标重置回第一行。 – arocks