* fix(migrator): Tag default:'null' always causes field migration #5953 * Update migrate_test.go * Update migrate_test.go * Update migrate_test.go Co-authored-by: Jinzhu <wosmvp@gmail.com>
This commit is contained in:
		
							parent
							
								
									da2b2861de
								
							
						
					
					
						commit
						16a272209a
					
				| @ -493,7 +493,7 @@ func (m Migrator) MigrateColumn(value interface{}, field *schema.Field, columnTy | |||||||
| 
 | 
 | ||||||
| 	// check default value
 | 	// check default value
 | ||||||
| 	if !field.PrimaryKey { | 	if !field.PrimaryKey { | ||||||
| 		currentDefaultNotNull := field.HasDefaultValue && !strings.EqualFold(field.DefaultValue, "NULL") | 		currentDefaultNotNull := field.HasDefaultValue && (field.DefaultValueInterface != nil || !strings.EqualFold(field.DefaultValue, "NULL")) | ||||||
| 		dv, dvNotNull := columnType.DefaultValue() | 		dv, dvNotNull := columnType.DefaultValue() | ||||||
| 		if dvNotNull && !currentDefaultNotNull { | 		if dvNotNull && !currentDefaultNotNull { | ||||||
| 			// defalut value -> null
 | 			// defalut value -> null
 | ||||||
|  | |||||||
| @ -1204,6 +1204,72 @@ func TestMigrateSameEmbeddedFieldName(t *testing.T) { | |||||||
| 	AssertEqual(t, nil, err) | 	AssertEqual(t, nil, err) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func TestMigrateDefaultNullString(t *testing.T) { | ||||||
|  | 	if DB.Dialector.Name() == "sqlserver" { | ||||||
|  | 		// sqlserver driver treats NULL and 'NULL' the same
 | ||||||
|  | 		t.Skip("skip sqlserver") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	type NullModel struct { | ||||||
|  | 		ID      uint | ||||||
|  | 		Content string `gorm:"default:null"` | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	type NullStringModel struct { | ||||||
|  | 		ID      uint | ||||||
|  | 		Content string `gorm:"default:'null'"` | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	tableName := "null_string_model" | ||||||
|  | 
 | ||||||
|  | 	DB.Migrator().DropTable(tableName) | ||||||
|  | 
 | ||||||
|  | 	err := DB.Table(tableName).AutoMigrate(&NullModel{}) | ||||||
|  | 	AssertEqual(t, err, nil) | ||||||
|  | 
 | ||||||
|  | 	// default null -> 'null'
 | ||||||
|  | 	err = DB.Table(tableName).AutoMigrate(&NullStringModel{}) | ||||||
|  | 	AssertEqual(t, err, nil) | ||||||
|  | 
 | ||||||
|  | 	columnType, err := findColumnType(tableName, "content") | ||||||
|  | 	AssertEqual(t, err, nil) | ||||||
|  | 
 | ||||||
|  | 	defVal, ok := columnType.DefaultValue() | ||||||
|  | 	AssertEqual(t, defVal, "null") | ||||||
|  | 	AssertEqual(t, ok, true) | ||||||
|  | 
 | ||||||
|  | 	// default 'null' -> 'null'
 | ||||||
|  | 	session := DB.Session(&gorm.Session{Logger: Tracer{ | ||||||
|  | 		Logger: DB.Config.Logger, | ||||||
|  | 		Test: func(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) { | ||||||
|  | 			sql, _ := fc() | ||||||
|  | 			if strings.HasPrefix(sql, "ALTER TABLE") { | ||||||
|  | 				t.Errorf("shouldn't execute: sql=%s", sql) | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 	}}) | ||||||
|  | 	err = session.Table(tableName).AutoMigrate(&NullStringModel{}) | ||||||
|  | 	AssertEqual(t, err, nil) | ||||||
|  | 
 | ||||||
|  | 	columnType, err = findColumnType(tableName, "content") | ||||||
|  | 	AssertEqual(t, err, nil) | ||||||
|  | 
 | ||||||
|  | 	defVal, ok = columnType.DefaultValue() | ||||||
|  | 	AssertEqual(t, defVal, "null") | ||||||
|  | 	AssertEqual(t, ok, true) | ||||||
|  | 
 | ||||||
|  | 	// default 'null' -> null
 | ||||||
|  | 	err = DB.Table(tableName).AutoMigrate(&NullModel{}) | ||||||
|  | 	AssertEqual(t, err, nil) | ||||||
|  | 
 | ||||||
|  | 	columnType, err = findColumnType(tableName, "content") | ||||||
|  | 	AssertEqual(t, err, nil) | ||||||
|  | 
 | ||||||
|  | 	defVal, ok = columnType.DefaultValue() | ||||||
|  | 	AssertEqual(t, defVal, "") | ||||||
|  | 	AssertEqual(t, ok, false) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func TestMigrateIgnoreRelations(t *testing.T) { | func TestMigrateIgnoreRelations(t *testing.T) { | ||||||
| 	type RelationModel1 struct { | 	type RelationModel1 struct { | ||||||
| 		ID uint | 		ID uint | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Haibo
						Haibo