【Python】sqlalchemy区 别 contextmanager

一、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

区别


 

发布了61 篇原创文章 · 获赞 2 · 访问量 7303

猜你喜欢

转载自blog.csdn.net/hebaojing/article/details/102977188