diff options
Diffstat (limited to 'lib/sqlalchemy/orm')
-rw-r--r-- | lib/sqlalchemy/orm/events.py | 3 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/scoping.py | 99 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/session.py | 38 |
3 files changed, 61 insertions, 79 deletions
diff --git a/lib/sqlalchemy/orm/events.py b/lib/sqlalchemy/orm/events.py index 29a509cb9..4e11ebb8c 100644 --- a/lib/sqlalchemy/orm/events.py +++ b/lib/sqlalchemy/orm/events.py @@ -1371,7 +1371,8 @@ class SessionEvents(event.Events): elif isinstance(target, Session): return target else: - return None + # allows alternate SessionEvents-like-classes to be consulted + return event.Events._accept_with(target) @classmethod def _listen(cls, event_key, raw=False, restore_load_context=False, **kw): diff --git a/lib/sqlalchemy/orm/scoping.py b/lib/sqlalchemy/orm/scoping.py index 1090501ca..29d845c0a 100644 --- a/lib/sqlalchemy/orm/scoping.py +++ b/lib/sqlalchemy/orm/scoping.py @@ -9,14 +9,60 @@ from . import class_mapper from . import exc as orm_exc from .session import Session from .. import exc as sa_exc +from ..util import create_proxy_methods from ..util import ScopedRegistry from ..util import ThreadLocalRegistry from ..util import warn - __all__ = ["scoped_session"] +@create_proxy_methods( + Session, + ":class:`_orm.Session`", + ":class:`_orm.scoping.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_bind", + "is_modified", + "bulk_save_objects", + "bulk_insert_mappings", + "bulk_update_mappings", + "merge", + "query", + "refresh", + "rollback", + "scalar", + ], + attributes=[ + "bind", + "dirty", + "deleted", + "new", + "identity_map", + "is_active", + "autoflush", + "no_autoflush", + "info", + "autocommit", + ], +) class scoped_session(object): """Provides scoped management of :class:`.Session` objects. @@ -53,6 +99,10 @@ class scoped_session(object): else: self.registry = ThreadLocalRegistry(session_factory) + @property + def _proxied(self): + return self.registry() + def __call__(self, **kw): r"""Return the current :class:`.Session`, creating it using the :attr:`.scoped_session.session_factory` if not present. @@ -156,50 +206,3 @@ class scoped_session(object): ScopedSession = scoped_session """Old name for backwards compatibility.""" - - -def instrument(name): - def do(self, *args, **kwargs): - return getattr(self.registry(), name)(*args, **kwargs) - - return do - - -for meth in Session.public_methods: - setattr(scoped_session, meth, instrument(meth)) - - -def makeprop(name): - def set_(self, attr): - setattr(self.registry(), name, attr) - - def get(self): - return getattr(self.registry(), name) - - return property(get, set_) - - -for prop in ( - "bind", - "dirty", - "deleted", - "new", - "identity_map", - "is_active", - "autoflush", - "no_autoflush", - "info", - "autocommit", -): - setattr(scoped_session, prop, makeprop(prop)) - - -def clslevel(name): - def do(cls, *args, **kwargs): - return getattr(Session, name)(*args, **kwargs) - - return classmethod(do) - - -for prop in ("close_all", "object_session", "identity_key"): - setattr(scoped_session, prop, clslevel(prop)) diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py index e32e05510..af0ac63e0 100644 --- a/lib/sqlalchemy/orm/session.py +++ b/lib/sqlalchemy/orm/session.py @@ -835,35 +835,6 @@ class Session(_SessionClassMethods): """ - public_methods = ( - "__contains__", - "__iter__", - "add", - "add_all", - "begin", - "begin_nested", - "close", - "commit", - "connection", - "delete", - "execute", - "expire", - "expire_all", - "expunge", - "expunge_all", - "flush", - "get_bind", - "is_modified", - "bulk_save_objects", - "bulk_insert_mappings", - "bulk_update_mappings", - "merge", - "query", - "refresh", - "rollback", - "scalar", - ) - @util.deprecated_params( autocommit=( "2.0", @@ -3028,7 +2999,14 @@ class Session(_SessionClassMethods): will unexpire attributes on access. """ - state = attributes.instance_state(obj) + try: + state = attributes.instance_state(obj) + except exc.NO_STATE as err: + util.raise_( + exc.UnmappedInstanceError(obj), + replace_context=err, + ) + to_attach = self._before_attach(state, obj) state._load_pending = True if to_attach: |