fix: diff schema update assign value (#6096)
This commit is contained in:
parent
707d70a542
commit
b62192456f
@ -245,11 +245,13 @@ func ConvertToAssignments(stmt *gorm.Statement) (set clause.Set) {
|
|||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
updatingSchema := stmt.Schema
|
updatingSchema := stmt.Schema
|
||||||
|
var isDiffSchema bool
|
||||||
if !updatingValue.CanAddr() || stmt.Dest != stmt.Model {
|
if !updatingValue.CanAddr() || stmt.Dest != stmt.Model {
|
||||||
// different schema
|
// different schema
|
||||||
updatingStmt := &gorm.Statement{DB: stmt.DB}
|
updatingStmt := &gorm.Statement{DB: stmt.DB}
|
||||||
if err := updatingStmt.Parse(stmt.Dest); err == nil {
|
if err := updatingStmt.Parse(stmt.Dest); err == nil {
|
||||||
updatingSchema = updatingStmt.Schema
|
updatingSchema = updatingStmt.Schema
|
||||||
|
isDiffSchema = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -276,7 +278,13 @@ func ConvertToAssignments(stmt *gorm.Statement) (set clause.Set) {
|
|||||||
|
|
||||||
if (ok || !isZero) && field.Updatable {
|
if (ok || !isZero) && field.Updatable {
|
||||||
set = append(set, clause.Assignment{Column: clause.Column{Name: field.DBName}, Value: value})
|
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 {
|
} else {
|
||||||
|
@ -773,3 +773,16 @@ func TestUpdateReturning(t *testing.T) {
|
|||||||
t.Errorf("failed to return updated age column")
|
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)
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user