关闭会话后使用SQLAlchemy实例

时间:2019-05-31 10:36:13

标签: python sqlalchemy

关闭会话后是否可以访问SQLAlchemy的实例? 我只想访问实例属性,而不更改它们的值。

在执行期间使用单个会话可以解决问题,但这是一个好习惯吗? (考虑到该程序可能会运行几天)

示例代码:

crud.py

@contextmanager
def session_scope():
    session = Session()
    try:
        yield session
        session.commit()
    except Exception:
        session.rollback()
        raise
    finally:
        session.close()

accessdb.py

class AccessDB(object):
    def add_user(self, name, password, is_admin=False):
        with session_scope() as s:
            user = User(username=name, password=password, is_admin=is_admin)
            s.add(user)

    def remove_user(self, username):
        with session_scope() as s:
            s.query(User).filter_by(username=username).delete()

    def list_users(self):
        with session_scope() as s:
            return s.query(User).all()


if __name__ == '__main__':
    a = AccessDB()
    a.add_user("user1", "123")
    a.add_user("user2", "123")
    a.remove_user("user1")
    users = a.list_users()
    print(users[0].username)

当我返回数据库中的所有用户时,出现此错误:

sqlalchemy.orm.exc.DetachedInstanceError: Instance <User at 0x31df350> is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: http://sqlalche.me/e/bhk3)

1 个答案:

答案 0 :(得分:0)

诸如commit()rollback()之类的方法会使所有对象失效。为了刷新对象,您必须使用session.refresh(users[0])。然后,您将能够再次访问对象属性。