fix: on confilct with default null (#6129)
* fix: on confilct with default null * Update create.go --------- Co-authored-by: Jinzhu <wosmvp@gmail.com>
This commit is contained in:
		
							parent
							
								
									85eaf9eeda
								
							
						
					
					
						commit
						e9f25c73ee
					
				| @ -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 { | ||||||
|  | |||||||
| @ -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
	 Cr
						Cr