From: Bart Schuurmans Date: Tue, 23 Dec 2025 16:23:54 +0000 (+0100) Subject: 🐛 Fix `RuntimeError: dictionary changed size during iteration` in `sqlmodel_update... X-Git-Tag: 0.0.28~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6cec19c8dcd867d940b773d6e3f6e2dca316cb0f;p=thirdparty%2Ffastapi%2Fsqlmodel.git 🐛 Fix `RuntimeError: dictionary changed size during iteration` in `sqlmodel_update()` (#997) Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com> --- diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 7c916f79..f168fc02 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -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 index 00000000..de4bd6cd --- /dev/null +++ b/tests/test_update.py @@ -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 + }, + )