diff options
| author | mike bayer <mike_mp@zzzcomputing.com> | 2019-07-18 16:55:22 +0000 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@bbpush.zzzcomputing.com> | 2019-07-18 16:55:22 +0000 |
| commit | 3bc3ea395eb16f548a11849bc15f0f78b7b2400f (patch) | |
| tree | 26237e4898960d348a3b6fdfb3e03bcdb8ad2c17 /lib/sqlalchemy | |
| parent | 736186f840646773217d3f7ba3f6a5d0bbfe1fdb (diff) | |
| parent | 5e8c7c88de2d9bac58e82bc1e5af7fcad5405855 (diff) | |
| download | sqlalchemy-3bc3ea395eb16f548a11849bc15f0f78b7b2400f.tar.gz | |
Merge "Fixes for uselist=True with m2o relationships"
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/orm/dependency.py | 8 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/dynamic.py | 12 | ||||
| -rw-r--r-- | lib/sqlalchemy/testing/entities.py | 6 |
3 files changed, 23 insertions, 3 deletions
diff --git a/lib/sqlalchemy/orm/dependency.py b/lib/sqlalchemy/orm/dependency.py index f0ba6051d..e93ad9eb7 100644 --- a/lib/sqlalchemy/orm/dependency.py +++ b/lib/sqlalchemy/orm/dependency.py @@ -938,7 +938,13 @@ class DetectKeySwitch(DependencyProcessor): related is not attributes.PASSIVE_NO_RESULT and related is not None ): - related_state = attributes.instance_state(dict_[self.key]) + if self.prop.uselist: + if not related: + continue + related_obj = related[0] + else: + related_obj = related + related_state = attributes.instance_state(related_obj) if related_state in switchers: uowcommit.register_object( state, False, self.passive_updates diff --git a/lib/sqlalchemy/orm/dynamic.py b/lib/sqlalchemy/orm/dynamic.py index 20544dbbe..3218b9fa3 100644 --- a/lib/sqlalchemy/orm/dynamic.py +++ b/lib/sqlalchemy/orm/dynamic.py @@ -14,6 +14,7 @@ basic add/delete mutation. from . import attributes from . import exc as orm_exc +from . import interfaces from . import object_mapper from . import object_session from . import properties @@ -36,6 +37,17 @@ class DynaLoader(strategies.AbstractRelationshipLoader): "many-to-one/one-to-one relationships and/or " "uselist=False." % self.parent_property ) + elif self.parent_property.direction not in ( + interfaces.ONETOMANY, + interfaces.MANYTOMANY, + ): + util.warn( + "On relationship %s, 'dynamic' loaders cannot be used with " + "many-to-one/one-to-one relationships and/or " + "uselist=False. This warning will be an exception in a " + "future release." % self.parent_property + ) + strategies._register_attribute( self.parent_property, mapper, diff --git a/lib/sqlalchemy/testing/entities.py b/lib/sqlalchemy/testing/entities.py index b894979d0..cbc7a2fd5 100644 --- a/lib/sqlalchemy/testing/entities.py +++ b/lib/sqlalchemy/testing/entities.py @@ -7,7 +7,7 @@ import sqlalchemy as sa from .. import exc as sa_exc - +from ..util import compat _repr_stack = set() @@ -90,7 +90,9 @@ class ComparableEntity(BasicEntity): except (AttributeError, sa_exc.UnboundExecutionError): return False - if hasattr(value, "__iter__"): + if hasattr(value, "__iter__") and not isinstance( + value, compat.string_types + ): if hasattr(value, "__getitem__") and not hasattr( value, "keys" ): |
