Add field tag to ignore migration (#4028)
* Add field tag to ignore migration * Fix null value with space * refactor migration tag
This commit is contained in:
		
							parent
							
								
									883c32e59a
								
							
						
					
					
						commit
						2ba612e805
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -2,3 +2,4 @@ TODO* | ||||
| documents | ||||
| coverage.txt | ||||
| _book | ||||
| .idea | ||||
|  | ||||
| @ -396,7 +396,7 @@ func (m Migrator) MigrateColumn(value interface{}, field *schema.Field, columnTy | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if alterColumn { | ||||
| 	if alterColumn && !field.IgnoreMigration { | ||||
| 		return m.DB.Migrator().AlterColumn(value, field.Name) | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -70,6 +70,7 @@ type Field struct { | ||||
| 	ReflectValueOf         func(reflect.Value) reflect.Value | ||||
| 	ValueOf                func(reflect.Value) (value interface{}, zero bool) | ||||
| 	Set                    func(reflect.Value, interface{}) error | ||||
| 	IgnoreMigration        bool | ||||
| } | ||||
| 
 | ||||
| func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field { | ||||
| @ -189,6 +190,7 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field { | ||||
| 	} | ||||
| 
 | ||||
| 	// default value is function or null or blank (primary keys)
 | ||||
| 	field.DefaultValue = strings.TrimSpace(field.DefaultValue) | ||||
| 	skipParseDefaultValue := strings.Contains(field.DefaultValue, "(") && | ||||
| 		strings.Contains(field.DefaultValue, ")") || strings.ToLower(field.DefaultValue) == "null" || field.DefaultValue == "" | ||||
| 	switch reflect.Indirect(fieldValue).Kind() { | ||||
| @ -295,11 +297,23 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field { | ||||
| 	} | ||||
| 
 | ||||
| 	// setup permission
 | ||||
| 	if _, ok := field.TagSettings["-"]; ok { | ||||
| 	if val, ok := field.TagSettings["-"]; ok { | ||||
| 		val = strings.ToLower(strings.TrimSpace(val)) | ||||
| 		switch val { | ||||
| 		case "-": | ||||
| 			field.Creatable = false | ||||
| 			field.Updatable = false | ||||
| 			field.Readable = false | ||||
| 			field.DataType = "" | ||||
| 		case "all": | ||||
| 			field.Creatable = false | ||||
| 			field.Updatable = false | ||||
| 			field.Readable = false | ||||
| 			field.DataType = "" | ||||
| 			field.IgnoreMigration = true | ||||
| 		case "migration": | ||||
| 			field.IgnoreMigration = true | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if v, ok := field.TagSettings["->"]; ok { | ||||
|  | ||||
| @ -66,6 +66,7 @@ func TestSmartMigrateColumn(t *testing.T) { | ||||
| 		Name                string    `gorm:"size:128"` | ||||
| 		Salary              float64   `gorm:"precision:2"` | ||||
| 		Birthday            time.Time `gorm:"precision:2"` | ||||
| 		NameIgnoreMigration string    `gorm:"size:100"` | ||||
| 	} | ||||
| 
 | ||||
| 	if err := DB.Table("user_migrate_columns").AutoMigrate(&UserMigrateColumn2{}); err != nil { | ||||
| @ -99,6 +100,7 @@ func TestSmartMigrateColumn(t *testing.T) { | ||||
| 		Name                string    `gorm:"size:256"` | ||||
| 		Salary              float64   `gorm:"precision:3"` | ||||
| 		Birthday            time.Time `gorm:"precision:3"` | ||||
| 		NameIgnoreMigration string    `gorm:"size:128;-:migration"` | ||||
| 	} | ||||
| 
 | ||||
| 	if err := DB.Table("user_migrate_columns").AutoMigrate(&UserMigrateColumn3{}); err != nil { | ||||
| @ -124,6 +126,10 @@ func TestSmartMigrateColumn(t *testing.T) { | ||||
| 			if precision, _, _ := columnType.DecimalSize(); (fullSupported || precision != 0) && precision != 3 { | ||||
| 				t.Fatalf("birthday's precision should be 2, but got %v", precision) | ||||
| 			} | ||||
| 		case "name_ignore_migration": | ||||
| 			if length, _ := columnType.Length(); (fullSupported || length != 0) && length != 100 { | ||||
| 				t.Fatalf("name_ignore_migration's length should still be 100 but got %v", length) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 yrong1997
						yrong1997