[SqlAlchemy实践]seesion线程安全管理

普通情况下session使用情况如下

1
2
3
4
5
6
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine('sqlite:///:memory:', echo=True)
DB_Session = sessionmaker(bind=engine)
session = DB_Session()

这种在单线程场景是没有问题的,但是在多线程场景下就不适用了。

我们可以通过scoped_session来实现多线程场景下的应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import sessionmaker
from contextlib import contextmanager
from sqlalchemy import create_engine, MetaData

# 线程安全session
engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/mydb?charset=utf8")

session_factory = sessionmaker(bind=engine)
sc_session = scoped_session(session_factory)

@contextmanager
def session_scope():
"""Provide a transactional scope around a series of operations."""
session = sc_session()
try:
yield session
except:
raise
finally:
sc_session.remove()