diff --git a/.gitignore b/.gitignore index c14d6005..e1b9ecea 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ TODO* documents coverage.txt _book +.idea diff --git a/migrator/migrator.go b/migrator/migrator.go index 91dd8e83..4e5051cf 100644 --- a/migrator/migrator.go +++ b/migrator/migrator.go @@ -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) } diff --git a/schema/field.go b/schema/field.go index 17cc6c43..5e792ed1 100644 --- a/schema/field.go +++ b/schema/field.go @@ -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 { - field.Creatable = false - field.Updatable = false - field.Readable = false - field.DataType = "" + 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 { diff --git a/tests/migrate_test.go b/tests/migrate_test.go index ca28dfbc..51843062 100644 --- a/tests/migrate_test.go +++ b/tests/migrate_test.go @@ -62,10 +62,11 @@ func TestSmartMigrateColumn(t *testing.T) { DB.AutoMigrate(&UserMigrateColumn{}) type UserMigrateColumn2 struct { - ID uint - Name string `gorm:"size:128"` - Salary float64 `gorm:"precision:2"` - Birthday time.Time `gorm:"precision:2"` + ID uint + 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 { @@ -95,10 +96,11 @@ func TestSmartMigrateColumn(t *testing.T) { } type UserMigrateColumn3 struct { - ID uint - Name string `gorm:"size:256"` - Salary float64 `gorm:"precision:3"` - Birthday time.Time `gorm:"precision:3"` + ID uint + 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) + } } }