Session 里的对象有哪些状态?事务是什么时候开始、什么时候结束的?请求结束之后手里的对象还能不能用?这篇用真实的 PostgreSQL,把状态、连接状态和事件顺序逐个打印出来。
Author(name=...) → transient session.add(a) → pending session.flush() → persistent session.commit() → persistent (expired) 读取 a.name → persistent session.delete(a) → persistent flush() → deleted commit() → detached
上一篇:Flask-SQLAlchemy 初始化过程;下一篇:Flask 请求与数据库事务边界。
动作 in_transaction 服务端连接状态 一开始 False idle 执行了 select 1 True idle in transaction commit() False idle 再执行 select 1 True idle in transaction rollback() False idle 离开应用上下文之后(session.remove)服务端连接状态: idle
add 之后 commit(): ['before_commit', 'before_flush', 'after_begin', 'after_flush', 'after_flush_postexec', 'after_commit'] add + flush 然后 rollback(): ['before_flush', 'after_begin', 'after_flush', 'after_flush_postexec', '--', 'after_rollback', 'after_soft_rollback']
/change 只改了属性没 commit,请求结束后库里 bob 的名字: bob 请求结束后拿着视图里的对象 keep[0] 的状态: detached 读已加载的属性 keep[0].name → CHANGED 读没加载过的关系 keep[0].books → DetachedInstanceError /commit 里 commit 之后对象状态: detached (expired) 请求结束后读过期对象的属性 → DetachedInstanceError
close() 前 persistent,close() 后 detached 重新 session.add(a) 后 persistent session.identity_map 里的对象数: 1