You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							108 lines
						
					
					
						
							2.9 KiB
						
					
					
				
			
		
		
	
	
							108 lines
						
					
					
						
							2.9 KiB
						
					
					
				# ext/asyncio/scoping.py
 | 
						|
# Copyright (C) 2005-2022 the SQLAlchemy authors and contributors
 | 
						|
# <see AUTHORS file>
 | 
						|
#
 | 
						|
# This module is part of SQLAlchemy and is released under
 | 
						|
# the MIT License: https://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",
 | 
						|
        "invalidate",
 | 
						|
        "merge",
 | 
						|
        "refresh",
 | 
						|
        "rollback",
 | 
						|
        "scalar",
 | 
						|
        "scalars",
 | 
						|
        "stream",
 | 
						|
        "stream_scalars",
 | 
						|
    ],
 | 
						|
    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
 | 
						|
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
    _support_async = True
 | 
						|
 | 
						|
    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()
 |