2016-11-29 135 views
0

我在我的项目中使用了sqlalchemy for orm。我的问题是,每次我使用session.refresh(OBJ)新的数据库连接被使用,直到session.close()被调用。 因此,当我想刷新多个对象时,我很快就会断开连接。SQLAlchemy session.refresh()产生新的连接

会议设施:

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) 

只有两个连接使用(这是罚款),但对象没有数据。

+0

我也试过'session.connection()来关闭()'后'session.refresh(OBJ)',但没有成功。 – literg

回答

0

使用scoped_session,看到http://docs.sqlalchemy.org/en/latest/orm/contextual.html

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

+0

不幸的是,没有帮助。至于另一个提议commit()清除对象的内容,当我尝试访问它们的字段时,它们会刷新。对我来说,它不会发生,因为提交后的对象在会话之外使用。奇怪的是,我试图创建最小的可复制的例子,但是当我自己实现sqlalchemy的用法时,它工作正常。 – literg