fix: fix: on confilct with struct default value

This commit is contained in:
Mo Huishou 2025-07-22 07:07:09 +00:00
parent 9af6d510b5
commit 173af3e871
2 changed files with 14 additions and 7 deletions

View File

@ -370,8 +370,8 @@ func ConvertToCreateValues(stmt *gorm.Statement) (values clause.Values) {
for _, column := range values.Columns { for _, column := range values.Columns {
if field := stmt.Schema.LookUpField(column.Name); field != nil { if field := stmt.Schema.LookUpField(column.Name); field != nil {
if v, ok := selectColumns[field.DBName]; (ok && v) || (!ok && !restricted) { if v, ok := selectColumns[field.DBName]; (ok && v) || (!ok && !restricted) {
if !field.PrimaryKey && (!field.HasDefaultValue || field.DefaultValueInterface != nil || if !field.PrimaryKey && field.AutoCreateTime == 0 &&
strings.EqualFold(field.DefaultValue, "NULL")) && field.AutoCreateTime == 0 { (!field.HasDefaultValue || field.DefaultValueInterface != nil || field.DefaultValue != "") {
if field.AutoUpdateTime > 0 { if field.AutoUpdateTime > 0 {
assignment := clause.Assignment{Column: clause.Column{Name: field.DBName}, Value: curTime} assignment := clause.Assignment{Column: clause.Column{Name: field.DBName}, Value: curTime}
switch field.AutoUpdateTime { switch field.AutoUpdateTime {

View File

@ -598,12 +598,17 @@ func TestCreateWithAutoIncrementCompositeKey(t *testing.T) {
} }
} }
func TestCreateOnConflictWithDefaultNull(t *testing.T) { func TestCreateOnConflictWithDefault(t *testing.T) {
type OnConflictUser struct { type OnConflictUser struct {
ID string ID string
Name string `gorm:"default:null"` Name string `gorm:"default:null"`
Email string Email string
Mobile string `gorm:"default:'133xxxx'"` Mobile string `gorm:"default:'133xxxx'"`
Company Company `gorm:"default:'{}';serializer:json"`
}
type Company struct {
Name string
} }
err := DB.Migrator().DropTable(&OnConflictUser{}) err := DB.Migrator().DropTable(&OnConflictUser{})
@ -623,6 +628,7 @@ func TestCreateOnConflictWithDefaultNull(t *testing.T) {
u.Name = "on-conflict-user-name-2" u.Name = "on-conflict-user-name-2"
u.Email = "on-conflict-user-email-2" u.Email = "on-conflict-user-email-2"
u.Mobile = "" u.Mobile = ""
u.Company.Name = "on-conflict-user-company-2"
err = DB.Clauses(clause.OnConflict{UpdateAll: true}).Create(&u).Error err = DB.Clauses(clause.OnConflict{UpdateAll: true}).Create(&u).Error
AssertEqual(t, err, nil) AssertEqual(t, err, nil)
@ -632,6 +638,7 @@ func TestCreateOnConflictWithDefaultNull(t *testing.T) {
AssertEqual(t, u2.Name, "on-conflict-user-name-2") AssertEqual(t, u2.Name, "on-conflict-user-name-2")
AssertEqual(t, u2.Email, "on-conflict-user-email-2") AssertEqual(t, u2.Email, "on-conflict-user-email-2")
AssertEqual(t, u2.Mobile, "133xxxx") AssertEqual(t, u2.Mobile, "133xxxx")
AssertEqual(t, u2.Company.Name, "on-conflict-user-company-2")
} }
func TestCreateFromMapWithoutPK(t *testing.T) { func TestCreateFromMapWithoutPK(t *testing.T) {