我接手了一个Flask应用,但它没有使用flask-sqlalchemy插件。我很难理解它的设置。
它有一个database.py
文件。
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session, Session
_session_factory = None
_scoped_session_cls = None
_db_session: Session = None
def _get_session_factory():
global _session_factory
if _session_factory is None:
_session_factory = sessionmaker(
bind=create_engine(CONNECTION_URL)
)
return _session_factory
def new_session():
session_factory = _get_session_factory()
return session_factory()
def new_scoped_session():
global _scoped_session_cls
if _scoped_session_cls is None:
session_factory = _get_session_factory()
if not session_factory:
return
_scoped_session_cls = scoped_session(session_factory)
return _scoped_session_cls()
def init_session():
global _db_session
if _db_session is not None:
log.warning("already init")
else:
_db_session = new_scoped_session()
return _db_session
def get_session():
return _db_session
当我们启动Flask应用时,它会调用
database.init_session()
,然后每当我们想要使用数据库时,它会调用database.get_session()
。这是一种正确/安全的与数据库交互的方式吗?如果有两个请求同时由不同线程处理,会发生什么情况?这会导致两个请求使用相同的会话而产生交叉污染吗?
session.Remove
。 - undefinedsqlalchemy
的问题的回答:https://stackoverflow.com/a/63989043/7929036 - undefined