关闭会话后是否可以访问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)
答案 0 :(得分:0)
诸如commit()
或rollback()
之类的方法会使所有对象失效。为了刷新对象,您必须使用session.refresh(users[0])
。然后,您将能够再次访问对象属性。