summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2022-11-04 12:48:43 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2022-11-04 12:49:49 -0400
commit7b6259c0f3ae411976f8febfe41f2c5fc3490b13 (patch)
tree3615eba95194e308417763bd7dafb074f788d6f6 /lib/sqlalchemy
parentb96321ae79a0366c33ca739e6e67aaf5f4420db4 (diff)
downloadsqlalchemy-7b6259c0f3ae411976f8febfe41f2c5fc3490b13.tar.gz
resolve synonyms in dictionary form of Session.get()
Improved "dictionary mode" for :meth:`_orm.Session.get` so that synonym names which refer to primary key attribute names may be indicated in the named dictionary. Fixes: #8753 Change-Id: I56112564a5c23b51b26e01c64087cbf4399cd951
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/orm/mapper.py18
-rw-r--r--lib/sqlalchemy/orm/session.py17
2 files changed, 34 insertions, 1 deletions
diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py
index 890728738..5f7ff43e4 100644
--- a/lib/sqlalchemy/orm/mapper.py
+++ b/lib/sqlalchemy/orm/mapper.py
@@ -2910,6 +2910,24 @@ class Mapper(
@HasMemoized.memoized_attribute
@util.preload_module("sqlalchemy.orm.descriptor_props")
+ def _pk_synonyms(self) -> Dict[str, str]:
+ """return a dictionary of {syn_attribute_name: pk_attr_name} for
+ all synonyms that refer to primary key columns
+
+ """
+ descriptor_props = util.preloaded.orm_descriptor_props
+
+ pk_keys = {prop.key for prop in self._identity_key_props}
+
+ return {
+ syn.key: syn.name
+ for k, syn in self._props.items()
+ if isinstance(syn, descriptor_props.SynonymProperty)
+ and syn.name in pk_keys
+ }
+
+ @HasMemoized.memoized_attribute
+ @util.preload_module("sqlalchemy.orm.descriptor_props")
def synonyms(self) -> util.ReadOnlyProperties[SynonymProperty[Any]]:
"""Return a namespace of all :class:`.Synonym`
properties maintained by this :class:`_orm.Mapper`.
diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py
index 540e64e7d..849d37ab2 100644
--- a/lib/sqlalchemy/orm/session.py
+++ b/lib/sqlalchemy/orm/session.py
@@ -3399,6 +3399,21 @@ class Session(_SessionClassMethods, EventTarget):
)
if is_dict:
+
+ pk_synonyms = mapper._pk_synonyms
+
+ if pk_synonyms:
+ correct_keys = set(pk_synonyms).intersection(
+ primary_key_identity
+ )
+
+ if correct_keys:
+ primary_key_identity = dict(primary_key_identity)
+ for k in correct_keys:
+ primary_key_identity[
+ pk_synonyms[k]
+ ] = primary_key_identity[k]
+
try:
primary_key_identity = list(
primary_key_identity[prop.key]
@@ -3409,7 +3424,7 @@ class Session(_SessionClassMethods, EventTarget):
raise sa_exc.InvalidRequestError(
"Incorrect names of values in identifier to formulate "
"primary key for session.get(); primary key attribute "
- "names are %s"
+ "names are %s (synonym names are also accepted)"
% ",".join(
"'%s'" % prop.key
for prop in mapper._identity_key_props