diff --git a/migrator/migrator.go b/migrator/migrator.go index 1800ab54..03ffdd02 100644 --- a/migrator/migrator.go +++ b/migrator/migrator.go @@ -119,13 +119,10 @@ func (m Migrator) AutoMigrate(values ...interface{}) error { for _, rel := range stmt.Schema.Relationships.Relations { if !m.DB.Config.DisableForeignKeyConstraintWhenMigrating { - if constraint := rel.ParseConstraint(); constraint != nil { - if constraint.Schema == stmt.Schema { - if !tx.Migrator().HasConstraint(value, constraint.Name) { - if err := tx.Migrator().CreateConstraint(value, constraint.Name); err != nil { - return err - } - } + if constraint := rel.ParseConstraint(); constraint != nil && + constraint.Schema == stmt.Schema && !tx.Migrator().HasConstraint(value, constraint.Name) { + if err := tx.Migrator().CreateConstraint(value, constraint.Name); err != nil { + return err } } } @@ -294,16 +291,20 @@ func (m Migrator) RenameTable(oldName, newName interface{}) error { func (m Migrator) AddColumn(value interface{}, field string) error { return m.RunWithValue(value, func(stmt *gorm.Statement) error { - if field := stmt.Schema.LookUpField(field); field != nil { - if !field.IgnoreMigration { - return m.DB.Exec( - "ALTER TABLE ? ADD ? ?", - m.CurrentTable(stmt), clause.Column{Name: field.DBName}, m.DB.Migrator().FullDataTypeOf(field), - ).Error - } - return nil + // avoid using the same name field + f := stmt.Schema.LookUpField(field) + if f == nil { + return fmt.Errorf("failed to look up field with name: %s", field) } - return fmt.Errorf("failed to look up field with name: %s", field) + + if !f.IgnoreMigration { + return m.DB.Exec( + "ALTER TABLE ? ADD ? ?", + m.CurrentTable(stmt), clause.Column{Name: f.DBName}, m.DB.Migrator().FullDataTypeOf(f), + ).Error + } + + return nil }) } diff --git a/schema/field.go b/schema/field.go index 1513b788..9efaa44a 100644 --- a/schema/field.go +++ b/schema/field.go @@ -423,12 +423,12 @@ func (field *Field) setupValuerAndSetter() { } else { v = v.Field(-idx - 1) - if v.Type().Elem().Kind() == reflect.Struct { - if !v.IsNil() { - v = v.Elem() - } else { - return nil, true - } + if v.Type().Elem().Kind() != reflect.Struct { + return nil, true + } + + if !v.IsNil() { + v = v.Elem() } else { return nil, true } diff --git a/schema/schema.go b/schema/schema.go index d37a72d8..8ade2ed7 100644 --- a/schema/schema.go +++ b/schema/schema.go @@ -45,9 +45,9 @@ type Schema struct { func (schema Schema) String() string { if schema.ModelType.Name() == "" { - return fmt.Sprintf("%v(%v)", schema.Name, schema.Table) + return fmt.Sprintf("%s(%s)", schema.Name, schema.Table) } - return fmt.Sprintf("%v.%v", schema.ModelType.PkgPath(), schema.ModelType.Name()) + return fmt.Sprintf("%s.%s", schema.ModelType.PkgPath(), schema.ModelType.Name()) } func (schema Schema) MakeSlice() reflect.Value { diff --git a/schema/utils.go b/schema/utils.go index add22047..e005cc74 100644 --- a/schema/utils.go +++ b/schema/utils.go @@ -178,17 +178,18 @@ func ToQueryValues(table string, foreignKeys []string, foreignValues [][]interfa } return clause.Column{Table: table, Name: foreignKeys[0]}, queryValues - } else { - columns := make([]clause.Column, len(foreignKeys)) - for idx, key := range foreignKeys { - columns[idx] = clause.Column{Table: table, Name: key} - } - - for idx, r := range foreignValues { - queryValues[idx] = r - } - return columns, queryValues } + + columns := make([]clause.Column, len(foreignKeys)) + for idx, key := range foreignKeys { + columns[idx] = clause.Column{Table: table, Name: key} + } + + for idx, r := range foreignValues { + queryValues[idx] = r + } + + return columns, queryValues } type embeddedNamer struct {