gpt4 book ai didi

python - SA警告 : At least one scoped session is already present

转载 作者:太空宇宙 更新时间:2023-11-03 17:30:50 25 4
gpt4 key购买 nike

我特意定义了 2 个不同的引擎(使用相同的数据库 URL),用于具有不同配置的 2 个 session ,Pyramid 的 model.py:

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))

DBSessionTask = scoped_session(sessionmaker(extension=ZopeTransactionExtension(), expire_on_commit=False))

配置 session (在 Pyramid 应用程序的主 __init__.py 中):

engine = engine_from_config(settings, 'sqlalchemy.')
DBSession.configure(bind=engine)
Base.metadata.bind = engine

engine_task = engine_from_config(settings, 'sqlalchemy.')
DBSessionTask.configure(bind=engine_task)

session 旨在用于 2 种不同类别的对象(DBSessionTask 用于保存在应用程序范围设置中的长期运行的监督对象,DBSession 用于典型范围内的对象) Web 应用程序的“数据”对象上的 session )。

我收到警告:

sqlalchemy\orm\scoping.py:99: SAWarning: At least one scoped session is already present.  configure() can not affect sessions that have already been created.
warn('At least one scoped session is already present. '

这是两个不同的引擎,那么为什么 SQA 会警告我呢?当然,他们使用相同的数据库 URL,但为什么这会成为问题呢?

最佳答案

如果你想在 Pyramid+SQLAlchemy 中使用多个 session ,你应该显式地管理它们,而不是依赖于作用域 session 。作用域 session sessionmaker 期望每个线程创建一个 session ,因此会出现问题。许多 Pyramid 开发人员更喜欢这样做作为一般规则,因为它非常适合通过请求和上下文对象传递所有内容的 Pyramid 哲学。我的偏好是制作一个具有获取和关闭 session 方法的数据库引擎组件,并通过配置器注册该组件。然后我有一个自定义请求工厂,它在请求开始时创建数据库 session ,并在最后提交或回滚它。通过在配置器部分中注册请求生命周期回调,您也可以在没有自定义请求工厂的情况下执行相同的操作。以下是执行上述操作的示例,取自说明书,您可以轻松地适应多个引擎:

http://pyramid-cookbook.readthedocs.org/en/latest/database/sqlalchemy.html

# __init__.py

from pyramid.config import Configurator
from sqlalchemy import engine_from_config
from sqlalchemy.orm import sessionmaker

def db(request):
maker = request.registry.dbmaker
session = maker()

def cleanup(request):
if request.exception is not None:
session.rollback()
else:
session.commit()
session.close()
request.add_finished_callback(cleanup)

return session


def main(global_config, **settings):
config = Configurator(settings=settings)
engine = engine_from_config(settings, prefix='sqlalchemy.')
config.registry.dbmaker = sessionmaker(bind=engine)
config.add_request_method(db, reify=True)

关于python - SA警告 : At least one scoped session is already present,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31876844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com