From 498c72d8b6c4a04112b490cdad6ba94324c69ce4 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Tue, 19 Oct 2021 16:13:51 -0400 Subject: [PATCH] revise _get_crud_kv_pairs from 18b4a3437 submitted 18b4a3437a60fbfa0c25287d9a3b83d7c9d4f762 too soon as @CaselIT found a great refinement for this method. Change-Id: Id3818aa6bdc5938fc2f1395558aa8ead8ea6b319 --- lib/sqlalchemy/orm/persistence.py | 78 +++++++++++++++---------------- 1 file changed, 38 insertions(+), 40 deletions(-) diff --git a/lib/sqlalchemy/orm/persistence.py b/lib/sqlalchemy/orm/persistence.py index 3d20cfdea0..4ba1917f63 100644 --- a/lib/sqlalchemy/orm/persistence.py +++ b/lib/sqlalchemy/orm/persistence.py @@ -2177,49 +2177,21 @@ class BulkORMUpdate(UpdateDMLState, BulkUDCompileState): def _get_crud_kv_pairs(cls, statement, kv_iterator): plugin_subject = statement._propagate_attrs["plugin_subject"] - if plugin_subject: - mapper = plugin_subject.mapper - else: - mapper = None + core_get_crud_kv_pairs = UpdateDMLState._get_crud_kv_pairs + + if not plugin_subject or not plugin_subject.mapper: + return core_get_crud_kv_pairs(statement, kv_iterator) + + mapper = plugin_subject.mapper values = [] - core_get_crud_kv_pairs = UpdateDMLState._get_crud_kv_pairs for k, v in kv_iterator: - if mapper: - k = coercions.expect(roles.DMLColumnRole, k) - - if isinstance(k, util.string_types): - desc = _entity_namespace_key(mapper, k, default=NO_VALUE) - if desc is NO_VALUE: - values.append( - ( - k, - coercions.expect( - roles.ExpressionElementRole, - v, - type_=sqltypes.NullType(), - is_crud=True, - ), - ) - ) - else: - values.extend( - core_get_crud_kv_pairs( - statement, desc._bulk_update_tuples(v) - ) - ) - elif "entity_namespace" in k._annotations: - k_anno = k._annotations - attr = _entity_namespace_key( - k_anno["entity_namespace"], k_anno["proxy_key"] - ) - values.extend( - core_get_crud_kv_pairs( - statement, attr._bulk_update_tuples(v) - ) - ) - else: + k = coercions.expect(roles.DMLColumnRole, k) + + if isinstance(k, util.string_types): + desc = _entity_namespace_key(mapper, k, default=NO_VALUE) + if desc is NO_VALUE: values.append( ( k, @@ -2231,8 +2203,34 @@ class BulkORMUpdate(UpdateDMLState, BulkUDCompileState): ), ) ) + else: + values.extend( + core_get_crud_kv_pairs( + statement, desc._bulk_update_tuples(v) + ) + ) + elif "entity_namespace" in k._annotations: + k_anno = k._annotations + attr = _entity_namespace_key( + k_anno["entity_namespace"], k_anno["proxy_key"] + ) + values.extend( + core_get_crud_kv_pairs( + statement, attr._bulk_update_tuples(v) + ) + ) else: - values.extend(core_get_crud_kv_pairs(statement, [(k, v)])) + values.append( + ( + k, + coercions.expect( + roles.ExpressionElementRole, + v, + type_=sqltypes.NullType(), + is_crud=True, + ), + ) + ) return values @classmethod -- 2.47.3