一、session定义
1. 创建、管理数据库连接的会话;模型对象通过session访问数据库,将返回结果以identity map方式映射到模型对象中。
2. 每个要操作的对象会被附加到session,如果这个session不close,别的session就无法使用这个对象。session的close只是释放对表的控制权限,并不是断开数据库连接,因此close后,仍然可以执行执行查询任务。
3. scoped_session()得到的session,如果不执行remove()方法,再次获取session,所获得的是同一个session。
4. flush: 预提交,提交到数据库内存,还未写入数据库文件
commit:将内存数据直接写入数据库,可以提供查询。
SQLAlchemy官网推荐用法
### another way (but again *not the only way*) to do it ###
from contextlib import contextmanager
@contextmanager
def session_scope():
"""Provide a transactional scope around a series of operations."""
session = Session()
try:
yield session
session.commit()
except:
session.rollback()
raise
finally:
session.close()
def run_my_program():
with session_scope() as session:
ThingOne().go(session)
ThingTwo().go(session)
二、session用法
Session工厂类:
Session = sessionmaker(binf=engine)
session实例的生命周期:
1. Web每次请求创建一个sesison,用完就close,即SQLAlchemy官网推荐用法。
缺点:连接池会被很快耗尽,被close的session没有立刻返回到连接池,请求时会出现等待连接情况。
2. Web项目全局使用一个session
缺点:官网所述,Session不是线程安全的
The Session object is entirely designed to be used
in a non-concurrent fashion, which in terms of multithreading
means “only in one thread at a time”.
3. Thread_local模式-session生命周期与request同步
http://rhel.cc/2016/07/14/sqlalchemy-session/
https://www.osgeo.cn/sqlalchemy/orm/session_transaction.html
https://farer.org/2017/10/28/sqlalchemy_scoped_session/
https://blog.csdn.net/yueguanghaidao/article/details/40016235
sqlalchemy
session.commit()
session.close() 释放连接资源
close()
and remove()
are "temporary", they don't make the session unusable in the future. Typically, you do not need to close
or remove
a scoped_session
, it will be managed automatically.
sqlalchemy是python中最强大的orm框架,无疑sqlalchemy的使用比django自带的orm要复杂的多,
使用flask sqlalchemy扩展将拉近和django的简单易用距离。
先来说两个比较重要的配置
app.config['SQLALCHEMY_ECHO'] = True =》配置输出sql语句
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True =》每次request自动提交db.session.commit(),
如果有一天你发现别的写的视图中有db.session.add,但没有db.session.commit,不要疑惑,他肯定配置了上面
的选项。
这是通过app.teardown_appcontext注册实现
@teardown
def shutdown_session(response_or_exc):
if app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']:
if response_or_exc is None:
self.session.commit()
self.session.remove()
return response_or_exc
区别