From 8771f3c27c1fb73b4b1a21cf706f6d81819b9f41 Mon Sep 17 00:00:00 2001 From: yrong Date: Tue, 9 Feb 2021 15:48:39 +0800 Subject: [PATCH] refactor migration tag --- schema/field.go | 26 +++++++++++++++++--------- tests/migrate_test.go | 22 ++++++++++++++-------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/schema/field.go b/schema/field.go index 23dcd82f..5e792ed1 100644 --- a/schema/field.go +++ b/schema/field.go @@ -189,10 +189,6 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field { field.Comment = val } - if _, ok := field.TagSettings["IGNOREMIGRATION"]; ok { - field.IgnoreMigration = true - } - // default value is function or null or blank (primary keys) field.DefaultValue = strings.TrimSpace(field.DefaultValue) skipParseDefaultValue := strings.Contains(field.DefaultValue, "(") && @@ -301,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) + } } }