summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2019-07-18 16:55:22 +0000
committerGerrit Code Review <gerrit@bbpush.zzzcomputing.com>2019-07-18 16:55:22 +0000
commit3bc3ea395eb16f548a11849bc15f0f78b7b2400f (patch)
tree26237e4898960d348a3b6fdfb3e03bcdb8ad2c17 /lib/sqlalchemy
parent736186f840646773217d3f7ba3f6a5d0bbfe1fdb (diff)
parent5e8c7c88de2d9bac58e82bc1e5af7fcad5405855 (diff)
downloadsqlalchemy-3bc3ea395eb16f548a11849bc15f0f78b7b2400f.tar.gz
Merge "Fixes for uselist=True with m2o relationships"
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/orm/dependency.py8
-rw-r--r--lib/sqlalchemy/orm/dynamic.py12
-rw-r--r--lib/sqlalchemy/testing/entities.py6
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"
):