diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-11-04 12:48:43 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-11-04 12:49:49 -0400 |
| commit | 7b6259c0f3ae411976f8febfe41f2c5fc3490b13 (patch) | |
| tree | 3615eba95194e308417763bd7dafb074f788d6f6 /lib/sqlalchemy | |
| parent | b96321ae79a0366c33ca739e6e67aaf5f4420db4 (diff) | |
| download | sqlalchemy-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.py | 18 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/session.py | 17 |
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 |
