diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2021-05-04 11:19:00 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2021-05-04 11:25:12 -0400 |
commit | dd6f4543bc8ccbf07bfc5c8fb850be60ab420b57 (patch) | |
tree | 19a5c09bb4245b9b430a214084cdbc93a0ece510 /lib/sqlalchemy/orm/dynamic.py | |
parent | f1f4f466fd809a14bff6d0c405a1d5da87438379 (diff) | |
download | sqlalchemy-dd6f4543bc8ccbf07bfc5c8fb850be60ab420b57.tar.gz |
Restore detached object logic for dynamic, but warn
Fixed regression involving ``lazy='dynamic'`` loader in conjunction with a
detached object. The previous behavior was that the dynamic loader upon
calling methods like ``.all()`` returns empty lists for detached objects
without error, this has been restored; however a warning is now emitted as
this is not the correct result. Other dynamic loader scenarios correctly
raise ``DetachedInstanceError``.
Fixes: #6426
Change-Id: Id7ad204bef947491fa7e462c5acda2055fada910
Diffstat (limited to 'lib/sqlalchemy/orm/dynamic.py')
-rw-r--r-- | lib/sqlalchemy/orm/dynamic.py | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/lib/sqlalchemy/orm/dynamic.py b/lib/sqlalchemy/orm/dynamic.py index a4b5f58c7..ac7eba03b 100644 --- a/lib/sqlalchemy/orm/dynamic.py +++ b/lib/sqlalchemy/orm/dynamic.py @@ -24,6 +24,7 @@ from .query import Query from .. import exc from .. import log from .. import util +from ..engine import result @log.class_logger @@ -324,17 +325,28 @@ class AppenderMixin(object): session = property(session, lambda s, x: None) - def __iter__(self): + def _iter(self): sess = self.session if sess is None: - return iter( + state = attributes.instance_state(self.instance) + if state.detached: + util.warn( + "Instance %s is detached, dynamic relationship cannot " + "return a correct result. This warning will become " + "a DetachedInstanceError in a future release." + % (orm_util.state_str(state)) + ) + + return result.IteratorResult( + result.SimpleResultMetaData([self.attr.class_.__name__]), self.attr._get_collection_history( attributes.instance_state(self.instance), attributes.PASSIVE_NO_INITIALIZE, - ).added_items - ) + ).added_items, + _source_supports_scalars=True, + ).scalars() else: - return iter(self._generate(sess)) + return self._generate(sess)._iter() def __getitem__(self, index): sess = self.session |