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
			| 
								 
											3 years ago
										 
									 | 
							
								# 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()
							 |