session基础用法
|
|
sessionmaker 应该放在哪里?
- 如果程序启动的时候知道连接到哪个数据库,就把sessionmaker 放在
__init__.py
中,在别的模块中 from mypackage import Session 这样引用 - 如果程序启动的时候不知道要去连接哪个数据库,可以使用 sessionmaker.configure()
推荐的session 用法
|
|
Thread-Local模式 —— 生命周期与 request 同步
|
|
|
|
这其实才是最适合 web 项目的 session 管理方式。(伪代码中没有写 commit 和 rollback,可自行添加)这样即避免了连接池的过快消耗,又避免了并发问题。
这也是 SQLAlchemy 文档中推荐的做法。
绑定request 请求前申请session request之后释放session
实践上更靠谱的一段代码可能是:
Flask-SqlAlchemy就是用上面的方法实现的
sqlalchemy session 总结
- sqlalchemy会把一个表对象 附加给一个session ,如果这个session不close,别的session无法使用这个对象
会报错:
User 对象已经附加给session 6 ,当前是 session 7 ,无法操作User
session的close() 只是释放对表的控制权,并不是断开连接(connect),所以close() 之后依然可以执行查询
使用scoped_session() 之后获得的session,如果不执行session.remove(),所获得的session都是同一个session
session.remove() 并不会,执行close(),所以正常的顺序应该是
- session = scoped_session(session_factory)
- s1 = session()
- s1.add(jessica)
- s1.commit()
- s1.close()
- session.remove()
- 因为如果没有执行 session.remove() 不需要执行 s1.close(),
应为同一个 session不需要释放,就可以提交。
如下 示例验证了上面的说法
参考:
http://my.oschina.net/lionets/blog/407263
http://docs.sqlalchemy.org/en/latest/orm/session_basics.html
- 普通session 和 使用 scoped_session的区别 传送门