python - 关闭 session 后使用SQLAlchemy实例

标签 python sqlalchemy

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

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

示例代码:

克鲁德

@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)

最佳答案

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

关于python - 关闭 session 后使用SQLAlchemy实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56393472/

相关文章:

python - 将 Flask SQLAlchemy 模型与常规 SQLAlchemy 结合使用

python - Flask + sqlalchemy 高级日志记录

python - 如果元素等于某个容差,我可以使用 numpy 快速设置 float 差异吗

python - Pandas 建立在 Cygwin 上

python - 对majorclust算法感到困惑

python 捕捉功能

python - 使用 SQLAlchemy OrderingList 更新现有对象的顺序

python - 成员在 __init__() 和其他方法中的初始化工作方式不同

python - 如果我们使用 SQLAlchemy 的 session.begin_nested ,为什么要提交而不给出更改?

python - 使用 wxPython 自定义窗口框架和窗口外观