102 lines
2.8 KiB
Python
102 lines
2.8 KiB
Python
|
# ext/asyncio/scoping.py
|
||
|
# Copyright (C) 2005-2021 the SQLAlchemy authors and contributors
|
||
|
# <see AUTHORS file>
|
||
|
#
|
||
|
# This module is part of SQLAlchemy and is released under
|
||
|
# the MIT License: http://www.opensource.org/licenses/mit-license.php
|
||
|
|
||
|
from .session import AsyncSession
|
||
|
from ...orm.scoping import ScopedSessionMixin
|
||
|
from ...util import create_proxy_methods
|
||
|
from ...util import ScopedRegistry
|
||
|
|
||
|
|
||
|
@create_proxy_methods(
|
||
|
AsyncSession,
|
||
|
":class:`_asyncio.AsyncSession`",
|
||
|
":class:`_asyncio.scoping.async_scoped_session`",
|
||
|
classmethods=["close_all", "object_session", "identity_key"],
|
||
|
methods=[
|
||
|
"__contains__",
|
||
|
"__iter__",
|
||
|
"add",
|
||
|
"add_all",
|
||
|
"begin",
|
||
|
"begin_nested",
|
||
|
"close",
|
||
|
"commit",
|
||
|
"connection",
|
||
|
"delete",
|
||
|
"execute",
|
||
|
"expire",
|
||
|
"expire_all",
|
||
|
"expunge",
|
||
|
"expunge_all",
|
||
|
"flush",
|
||
|
"get",
|
||
|
"get_bind",
|
||
|
"is_modified",
|
||
|
"merge",
|
||
|
"refresh",
|
||
|
"rollback",
|
||
|
"scalar",
|
||
|
],
|
||
|
attributes=[
|
||
|
"bind",
|
||
|
"dirty",
|
||
|
"deleted",
|
||
|
"new",
|
||
|
"identity_map",
|
||
|
"is_active",
|
||
|
"autoflush",
|
||
|
"no_autoflush",
|
||
|
"info",
|
||
|
],
|
||
|
)
|
||
|
class async_scoped_session(ScopedSessionMixin):
|
||
|
"""Provides scoped management of :class:`.AsyncSession` objects.
|
||
|
|
||
|
See the section :ref:`asyncio_scoped_session` for usage details.
|
||
|
|
||
|
.. versionadded:: 1.4.19
|
||
|
|
||
|
|
||
|
"""
|
||
|
|
||
|
def __init__(self, session_factory, scopefunc):
|
||
|
"""Construct a new :class:`_asyncio.async_scoped_session`.
|
||
|
|
||
|
:param session_factory: a factory to create new :class:`_asyncio.AsyncSession`
|
||
|
instances. This is usually, but not necessarily, an instance
|
||
|
of :class:`_orm.sessionmaker` which itself was passed the
|
||
|
:class:`_asyncio.AsyncSession` to its :paramref:`_orm.sessionmaker.class_`
|
||
|
parameter::
|
||
|
|
||
|
async_session_factory = sessionmaker(some_async_engine, class_= AsyncSession)
|
||
|
AsyncSession = async_scoped_session(async_session_factory, scopefunc=current_task)
|
||
|
|
||
|
:param scopefunc: function which defines
|
||
|
the current scope. A function such as ``asyncio.current_task``
|
||
|
may be useful here.
|
||
|
|
||
|
""" # noqa E501
|
||
|
|
||
|
self.session_factory = session_factory
|
||
|
self.registry = ScopedRegistry(session_factory, scopefunc)
|
||
|
|
||
|
@property
|
||
|
def _proxied(self):
|
||
|
return self.registry()
|
||
|
|
||
|
async def remove(self):
|
||
|
"""Dispose of the current :class:`.AsyncSession`, if present.
|
||
|
|
||
|
Different from scoped_session's remove method, this method would use
|
||
|
await to wait for the close method of AsyncSession.
|
||
|
|
||
|
"""
|
||
|
|
||
|
if self.registry.has():
|
||
|
await self.registry().close()
|
||
|
self.registry.clear()
|