Merge 362fda45ca2f74bc860944ab68c2b9d38200bb3b into 4e34a6d21b63e9a9b701a70be9759e5539bf26e9

This commit is contained in:
Mo Huishou 2025-08-20 13:58:07 +08:00 committed by GitHub
commit a6da201874
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 14 additions and 8 deletions

View File

@ -3,7 +3,6 @@ package callbacks
import ( import (
"fmt" "fmt"
"reflect" "reflect"
"strings"
"gorm.io/gorm" "gorm.io/gorm"
"gorm.io/gorm/clause" "gorm.io/gorm/clause"
@ -373,8 +372,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) {