SQLAlchemy session.refresh()生成新连接

时间:2016-11-29 14:50:57

标签: python orm sqlalchemy

我在项目中使用sqlalchemy作为orm。我的问题是每次我使用session.refresh(obj)时都会使用新的数据库连接,直到调用session.close()为止。 因此,当我想刷新多个对象时,我很快就会耗尽连接。

会话制作者:

session = session_maker()
try:
    yield session
    session.commit()
    for obj in session:
        session.refresh(obj)
except Exception as e:
    session.rollback()
    raise e
finally:
    session.close()

用法:

with make_session(...) as session:
        for mapped in [self._mapper.map(obj) for obj in objects]:
            saved_entities.append(mapped)
            session.add(mapped)
        session.flush()

我正在使用刷新,因为我的列已在更新时填充,我想返回当前值。

奇怪的是,当我这样做时:

for obj in session:
    session.commit()
    session.refresh(obj)

只使用了两个连接(很好),但对象没有数据。

1 个答案:

答案 0 :(得分:0)

使用scoped_session,请参阅http://docs.sqlalchemy.org/en/latest/orm/contextual.html

如果这样做,每次请求时都会得到相同的会话(连接ID)。此外,您不需要调用refresh():add()和flush()应该足够,更新后的值应该在flush()之后和commit()之前可用,但前提是你只需要#39 ;使用相同的会话ID(数据库事务)来查找它们(因此,您需要一个scoped_session)。