Merge branch 'master' into master
This commit is contained in:
		
						commit
						f04a2a376d
					
				@ -3,6 +3,7 @@ package callbacks
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"reflect"
 | 
						"reflect"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"gorm.io/gorm"
 | 
						"gorm.io/gorm"
 | 
				
			||||||
	"gorm.io/gorm/clause"
 | 
						"gorm.io/gorm/clause"
 | 
				
			||||||
@ -302,7 +303,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) && field.AutoCreateTime == 0 {
 | 
												if !field.PrimaryKey && (!field.HasDefaultValue || field.DefaultValueInterface != nil ||
 | 
				
			||||||
 | 
													strings.EqualFold(field.DefaultValue, "NULL")) && field.AutoCreateTime == 0 {
 | 
				
			||||||
								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 {
 | 
				
			||||||
 | 
				
			|||||||
@ -916,6 +916,8 @@ func (field *Field) setupValuerAndSetter() {
 | 
				
			|||||||
			sameElemType = field.FieldType == reflect.ValueOf(field.Serializer).Type().Elem()
 | 
								sameElemType = field.FieldType == reflect.ValueOf(field.Serializer).Type().Elem()
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							serializerValue := reflect.Indirect(reflect.ValueOf(field.Serializer))
 | 
				
			||||||
 | 
							serializerType := serializerValue.Type()
 | 
				
			||||||
		field.Set = func(ctx context.Context, value reflect.Value, v interface{}) (err error) {
 | 
							field.Set = func(ctx context.Context, value reflect.Value, v interface{}) (err error) {
 | 
				
			||||||
			if s, ok := v.(*serializer); ok {
 | 
								if s, ok := v.(*serializer); ok {
 | 
				
			||||||
				if s.fieldValue != nil {
 | 
									if s.fieldValue != nil {
 | 
				
			||||||
@ -923,11 +925,12 @@ func (field *Field) setupValuerAndSetter() {
 | 
				
			|||||||
				} else if err = s.Serializer.Scan(ctx, field, value, s.value); err == nil {
 | 
									} else if err = s.Serializer.Scan(ctx, field, value, s.value); err == nil {
 | 
				
			||||||
					if sameElemType {
 | 
										if sameElemType {
 | 
				
			||||||
						field.ReflectValueOf(ctx, value).Set(reflect.ValueOf(s.Serializer).Elem())
 | 
											field.ReflectValueOf(ctx, value).Set(reflect.ValueOf(s.Serializer).Elem())
 | 
				
			||||||
						s.Serializer = reflect.New(reflect.Indirect(reflect.ValueOf(field.Serializer)).Type()).Interface().(SerializerInterface)
 | 
					 | 
				
			||||||
					} else if sameType {
 | 
										} else if sameType {
 | 
				
			||||||
						field.ReflectValueOf(ctx, value).Set(reflect.ValueOf(s.Serializer))
 | 
											field.ReflectValueOf(ctx, value).Set(reflect.ValueOf(s.Serializer))
 | 
				
			||||||
						s.Serializer = reflect.New(reflect.Indirect(reflect.ValueOf(field.Serializer)).Type()).Interface().(SerializerInterface)
 | 
					 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
										si := reflect.New(serializerType)
 | 
				
			||||||
 | 
										si.Elem().Set(serializerValue)
 | 
				
			||||||
 | 
										s.Serializer = si.Interface().(SerializerInterface)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				err = oldFieldSetter(ctx, value, v)
 | 
									err = oldFieldSetter(ctx, value, v)
 | 
				
			||||||
@ -939,11 +942,15 @@ func (field *Field) setupValuerAndSetter() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (field *Field) setupNewValuePool() {
 | 
					func (field *Field) setupNewValuePool() {
 | 
				
			||||||
	if field.Serializer != nil {
 | 
						if field.Serializer != nil {
 | 
				
			||||||
 | 
							serializerValue := reflect.Indirect(reflect.ValueOf(field.Serializer))
 | 
				
			||||||
 | 
							serializerType := serializerValue.Type()
 | 
				
			||||||
		field.NewValuePool = &sync.Pool{
 | 
							field.NewValuePool = &sync.Pool{
 | 
				
			||||||
			New: func() interface{} {
 | 
								New: func() interface{} {
 | 
				
			||||||
 | 
									si := reflect.New(serializerType)
 | 
				
			||||||
 | 
									si.Elem().Set(serializerValue)
 | 
				
			||||||
				return &serializer{
 | 
									return &serializer{
 | 
				
			||||||
					Field:      field,
 | 
										Field:      field,
 | 
				
			||||||
					Serializer: field.Serializer,
 | 
										Serializer: si.Interface().(SerializerInterface),
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
				
			|||||||
@ -576,3 +576,39 @@ func TestCreateWithAutoIncrementCompositeKey(t *testing.T) {
 | 
				
			|||||||
		AssertObjEqual(t, newProd, prod, "ProductID", "LanguageCode", "Code", "Name")
 | 
							AssertObjEqual(t, newProd, prod, "ProductID", "LanguageCode", "Code", "Name")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestCreateOnConfilctWithDefalutNull(t *testing.T) {
 | 
				
			||||||
 | 
						type OnConfilctUser struct {
 | 
				
			||||||
 | 
							ID     string
 | 
				
			||||||
 | 
							Name   string `gorm:"default:null"`
 | 
				
			||||||
 | 
							Email  string
 | 
				
			||||||
 | 
							Mobile string `gorm:"default:'133xxxx'"`
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := DB.Migrator().DropTable(&OnConfilctUser{})
 | 
				
			||||||
 | 
						AssertEqual(t, err, nil)
 | 
				
			||||||
 | 
						err = DB.AutoMigrate(&OnConfilctUser{})
 | 
				
			||||||
 | 
						AssertEqual(t, err, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						u := OnConfilctUser{
 | 
				
			||||||
 | 
							ID:     "on-confilct-user-id",
 | 
				
			||||||
 | 
							Name:   "on-confilct-user-name",
 | 
				
			||||||
 | 
							Email:  "on-confilct-user-email",
 | 
				
			||||||
 | 
							Mobile: "on-confilct-user-mobile",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err = DB.Create(&u).Error
 | 
				
			||||||
 | 
						AssertEqual(t, err, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						u.Name = "on-confilct-user-name-2"
 | 
				
			||||||
 | 
						u.Email = "on-confilct-user-email-2"
 | 
				
			||||||
 | 
						u.Mobile = ""
 | 
				
			||||||
 | 
						err = DB.Clauses(clause.OnConflict{UpdateAll: true}).Create(&u).Error
 | 
				
			||||||
 | 
						AssertEqual(t, err, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var u2 OnConfilctUser
 | 
				
			||||||
 | 
						err = DB.Where("id = ?", u.ID).First(&u2).Error
 | 
				
			||||||
 | 
						AssertEqual(t, err, nil)
 | 
				
			||||||
 | 
						AssertEqual(t, u2.Name, "on-confilct-user-name-2")
 | 
				
			||||||
 | 
						AssertEqual(t, u2.Email, "on-confilct-user-email-2")
 | 
				
			||||||
 | 
						AssertEqual(t, u2.Mobile, "133xxxx")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -9,11 +9,12 @@ require (
 | 
				
			|||||||
	github.com/lib/pq v1.10.7
 | 
						github.com/lib/pq v1.10.7
 | 
				
			||||||
	github.com/mattn/go-sqlite3 v1.14.16 // indirect
 | 
						github.com/mattn/go-sqlite3 v1.14.16 // indirect
 | 
				
			||||||
	github.com/microsoft/go-mssqldb v0.20.0 // indirect
 | 
						github.com/microsoft/go-mssqldb v0.20.0 // indirect
 | 
				
			||||||
 | 
						golang.org/x/crypto v0.7.0 // indirect
 | 
				
			||||||
	gorm.io/driver/mysql v1.4.7
 | 
						gorm.io/driver/mysql v1.4.7
 | 
				
			||||||
	gorm.io/driver/postgres v1.4.8
 | 
						gorm.io/driver/postgres v1.4.8
 | 
				
			||||||
	gorm.io/driver/sqlite v1.4.4
 | 
						gorm.io/driver/sqlite v1.4.4
 | 
				
			||||||
	gorm.io/driver/sqlserver v1.4.2
 | 
						gorm.io/driver/sqlserver v1.4.2
 | 
				
			||||||
	gorm.io/gorm v1.24.5
 | 
						gorm.io/gorm v1.24.6
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
replace gorm.io/gorm => ../
 | 
					replace gorm.io/gorm => ../
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user