根据SQLAlchemy documentation,应在应用程序的全局范围内创建引擎和sessionmaker实例:
何时创建会话创建者?
仅一次,在您应用程序的全局范围内的某个位置。应该将其视为应用程序配置的一部分。如果您的应用程序在一个程序包中包含三个.py文件,则可以将sessionmaker行放在__init__.py文件中;例如,从那时起,在其他模块上说“ from mypackage import Session”。这样,其他所有人都只使用Session(),并且该会话的配置由该中心点控制。
问题:
清理SQLAlchemy引擎和sessionmaker实例的最佳实践是什么?请参考下面的示例,虽然我可以在 main.py 中调用engine.dispose()
,但从另一个模块(数据库中清除全局对象)似乎不是一个好习惯( main.py )中的.py ),有更好的方法吗?
我们需要清理sessionmaker实例吗?似乎没有方法可以关闭sessionmaker实例(不建议使用__main__
,而sessionmaker.close_all()
是会话实例方法,而不是sessionmaker方法。)
示例:
session.close_all_sessions()
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from contextlib import contextmanager
DB_ENGINE = create_engine(DB_CONNECTION_STRING, pool_size=5, max_overflow=10)
DB_SESSION = sessionmaker(bind=DB_ENGINE, autocommit=False, autoflush=True, expire_on_commit=False)
@contextmanager
def db_session(db_session_factory):
"""Provide a transactional scope around a series of operations."""
session = db_session_factory()
try:
yield session
session.commit()
except:
session.rollback()
raise
finally:
session.close()
的末尾清理了引擎实例。__main__