描述
print(user)
# name=user,age=18, ...
session.commit()
print(user)
# empty
原因
sqlalchemy为了保持session内的数据同步,默认了expire_on_commit为True,它表现在:
# 查询
b = session.query(User).filter(User.id==2).first()
# 更改数据
b.name = "user_b"
session.add(b)
session.flush()
session.commit()
# commit后再次访问,其实是重新进行了select操作
b.name
# user_b
expire_on_commit可以用来更改 SQLAlchemy 的对象刷新机制,默认值为True即在session调用commit之后会主动将同一个session在commit之前查询得到的 ORM 对象的_sa_instance_state.expire属性设置为Flase,再次读取该对象属性时将重载这个对象,方法是重新调用之前的查询语句。
这样做确实可以很方便的保持数据同步,但是实际中经常会把得到的数据返回到session以外,此时commit操作就会导致数据被清空。
解决
session = Session(engine, expire_on_commit=False)
即可避免内存中的数据被清空和更改。