清理SQLAlchemy引擎和sessionmaker实例的最佳做法?

时间:2019-12-14 17:53:39

标签: python python-3.x sqlalchemy

根据SQLAlchemy documentation,应在应用程序的全局范围内创建引擎和sessionmaker实例:

  

何时创建会话创建者?
仅一次,在您应用程序的全局范围内的某个位置。应该将其视为应用程序配置的一部分。如果您的应用程序在一个程序包中包含三个.py文件,则可以将sessionmaker行放在__init__.py文件中;例如,从那时起,在其他模块上说“ from mypackage import Session”。这样,其他所有人都只使用Session(),并且该会话的配置由该中心点控制。

问题:

  1. 清理SQLAlchemy引擎和sessionmaker实例的最佳实践是什么?请参考下面的示例,虽然我可以在 main.py 中调用engine.dispose(),但从另一个模块(数据库中清除全局对象)似乎不是一个好习惯( main.py )中的.py ),有更好的方法吗?

  2. 我们需要清理sessionmaker实例吗?似乎没有方法可以关闭sessionmaker实例(不建议使用__main__,而sessionmaker.close_all()是会话实例方法,而不是sessionmaker方法。)

示例:

  • 我在名为 database.py 的模块中创建了engine和sessionmaker对象:
session.close_all_sessions()
  • 在主应用程序 main.py 中,导入模块并按如下所示使用engine和sessionmaker实例。我在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__

0 个答案:

没有答案