【问题标题】:Looping through a result proxy object循环通过结果代理对象
【发布时间】:2014-01-22 17:41:32
【问题描述】:

得到一个嵌套循环,内部循环是一个 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])

【问题讨论】:

    标签: python for-loop sqlalchemy


    【解决方案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)
    

    【讨论】:

    • 但是为什么呢?假设我将for y in range(5) 作为我的内部循环而不是结果代理对象,我希望它一直迭代而不会出错。为什么结果代理对象不同?结果代理对象是否维护与数据库的连接,以便在 1 次迭代后耗尽?我不明白。
    • result 是指向结果中一行的数据库游标的代理。在内部循环的末尾,它指向最后一行之后。所以要返回,您需要将该光标重置回第一行。
    猜你喜欢
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 2021-05-05
    • 2016-10-11
    • 2020-07-17
    • 2020-05-05
    相关资源
    最近更新 更多