gpt4 book ai didi

python - yield_per 期间出现 sqlalchemy 游标错误

转载 作者:太空狗 更新时间:2023-10-29 17:44:15 25 4
gpt4 key购买 nike

我收到以下错误:

Traceback (most recent call last):
main()
for item in session.query(Item).yield_per(10):
fetch = cursor.fetchmany(self._yield_per)
self.cursor, self.context)
l = self.process_rows(self._fetchmany_impl(size))
row = self._fetchone_impl()
self.__buffer_rows()
self.__rowbuffer = collections.deque(self.cursor.fetchmany(size))
sqlalchemy.exc.ProgrammingError: (ProgrammingError) named cursor isn't valid anymore None None

我怀疑调用 session.commit() 会干扰 .yield_per

sessionmaker_ = sessionmaker(autocommit=False, autoflush=False, bind=engine)
session = scoped_session(sessionmaker_)

def foo(item):
# DO something to the item
session.add(item)
session.commit()

def main():
for item in session.query(Item).yield_per(5):
foo(item)

有什么想法吗?

最佳答案

如果您还没有从 DBAPI 游标中提取所有行,那么在该游标的连接上调用 commit() 通常不是一个好主意。在这种情况下,psycopg2(我猜这是你正在使用的 DBAPI)无法在事务中维护命名游标的状态(当你需要服务器缓冲行时它会使用它)。

您绝对应该在此处更改的一件事是您提交的频率。理想情况下,在整个操作完成之前,您不会提交任何内容。 Session 将根据需要自动刷新数据(好吧,如果你打开了自动刷新,我建议这样做),或者你可以调用 flush() 来强制它,但这与实际提交事务无关。所有那些对 commit() 的调用都会使操作的效率大大低于它必须的效率,当然它会妨碍其他结果集的游标。如果您只将一个 commit() 放在循环的末尾,那么您将同时解决这两个问题。

如果您仍然需要在整个操作完成之前提交,或者即使没有,我更喜欢分 block 工作而不是使用 yield_per(),它非常脆弱。食谱在http://www.sqlalchemy.org/trac/wiki/UsageRecipes/WindowedRangeQuery显示了一种方法来做到这一点。总体而言,DBAPI 不太适合处理非常大的结果集,尽管 psycopg2 给了我们更多的回旋余地。

关于python - yield_per 期间出现 sqlalchemy 游标错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12233115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com