]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
revise _get_crud_kv_pairs from 18b4a3437
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 19 Oct 2021 20:13:51 +0000 (16:13 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 19 Oct 2021 20:13:51 +0000 (16:13 -0400)
submitted 18b4a3437a60fbfa0c25287d9a3b83d7c9d4f762 too soon
as @CaselIT found a great refinement for this method.

Change-Id: Id3818aa6bdc5938fc2f1395558aa8ead8ea6b319

lib/sqlalchemy/orm/persistence.py

index 3d20cfdea076986edddca885ac9d93cde41ec965..4ba1917f63f64aa3a78c7086ee6651f1fb2f87e2 100644 (file)
@@ -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