fix: on confilct with default null
This commit is contained in:
		
							parent
							
								
									85eaf9eeda
								
							
						
					
					
						commit
						bf49d4caa4
					
				@ -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.ToUpper(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 {
 | 
				
			||||||
 | 
				
			|||||||
@ -547,3 +547,39 @@ func TestFirstOrCreateRowsAffected(t *testing.T) {
 | 
				
			|||||||
		t.Fatalf("first or create rows affect err:%v rows:%d", res.Error, res.RowsAffected)
 | 
							t.Fatalf("first or create rows affect err:%v rows:%d", res.Error, res.RowsAffected)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user