From b62192456fdeb98e67497c97fe3309e135d11fd1 Mon Sep 17 00:00:00 2001 From: Cr <631807682@qq.com> Date: Fri, 10 Mar 2023 17:04:54 +0800 Subject: [PATCH] fix: diff schema update assign value (#6096) --- callbacks/update.go | 10 +++++++++- tests/update_test.go | 13 +++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/callbacks/update.go b/callbacks/update.go index fe6f0994..4eb75788 100644 --- a/callbacks/update.go +++ b/callbacks/update.go @@ -245,11 +245,13 @@ func ConvertToAssignments(stmt *gorm.Statement) (set clause.Set) { } default: updatingSchema := stmt.Schema + var isDiffSchema bool if !updatingValue.CanAddr() || stmt.Dest != stmt.Model { // different schema updatingStmt := &gorm.Statement{DB: stmt.DB} if err := updatingStmt.Parse(stmt.Dest); err == nil { updatingSchema = updatingStmt.Schema + isDiffSchema = true } } @@ -276,7 +278,13 @@ func ConvertToAssignments(stmt *gorm.Statement) (set clause.Set) { if (ok || !isZero) && field.Updatable { set = append(set, clause.Assignment{Column: clause.Column{Name: field.DBName}, Value: value}) - assignValue(field, value) + assignField := field + if isDiffSchema { + if originField := stmt.Schema.LookUpField(dbName); originField != nil { + assignField = originField + } + } + assignValue(assignField, value) } } } else { diff --git a/tests/update_test.go b/tests/update_test.go index d7634580..b2da11c6 100644 --- a/tests/update_test.go +++ b/tests/update_test.go @@ -773,3 +773,16 @@ func TestUpdateReturning(t *testing.T) { t.Errorf("failed to return updated age column") } } + +func TestUpdateWithDiffSchema(t *testing.T) { + user := GetUser("update-diff-schema-1", Config{}) + DB.Create(&user) + + type UserTemp struct { + Name string + } + + err := DB.Model(&user).Updates(&UserTemp{Name: "update-diff-schema-2"}).Error + AssertEqual(t, err, nil) + AssertEqual(t, "update-diff-schema-2", user.Name) +}