]> git.ipfire.org Git - thirdparty/fastapi/sqlmodel.git/commitdiff
🐛 Fix `RuntimeError: dictionary changed size during iteration` in `sqlmodel_update...
authorBart Schuurmans <bart@minnozz.com>
Tue, 23 Dec 2025 16:23:54 +0000 (17:23 +0100)
committerGitHub <noreply@github.com>
Tue, 23 Dec 2025 16:23:54 +0000 (17:23 +0100)
Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
sqlmodel/main.py
tests/test_update.py [new file with mode: 0644]

index 7c916f79af0deeb510ff2ac402253453b504c5ee..f168fc02acc989352aa99de0059d591e5ce963b4 100644 (file)
@@ -1004,9 +1004,8 @@ class SQLModel(BaseModel, metaclass=SQLModelMetaclass, registry=default_registry
                 else:
                     value = getattr(obj, key)
                 setattr(self, key, value)
-            for remaining_key in use_update:
+            for remaining_key, value in use_update.items():
                 if remaining_key in get_model_fields(self):
-                    value = use_update.pop(remaining_key)
                     setattr(self, remaining_key, value)
         else:
             raise ValueError(
diff --git a/tests/test_update.py b/tests/test_update.py
new file mode 100644 (file)
index 0000000..de4bd6c
--- /dev/null
@@ -0,0 +1,20 @@
+from sqlmodel import Field, SQLModel
+
+
+def test_sqlmodel_update():
+    class Organization(SQLModel, table=True):
+        id: int = Field(default=None, primary_key=True)
+        name: str
+        headquarters: str
+
+    class OrganizationUpdate(SQLModel):
+        name: str
+
+    org = Organization(name="Example Org", city="New York", headquarters="NYC HQ")
+    org_in = OrganizationUpdate(name="Updated org")
+    org.sqlmodel_update(
+        org_in,
+        update={
+            "headquarters": "-",  # This field is in Organization, but not in OrganizationUpdate
+        },
+    )