diff --git a/migrator/migrator.go b/migrator/migrator.go index 50a36d10..739effef 100644 --- a/migrator/migrator.go +++ b/migrator/migrator.go @@ -720,6 +720,7 @@ func (m Migrator) GuessConstraintInterfaceAndTable(stmt *gorm.Statement, name st for _, rel := range stmt.Schema.Relationships.Relations { if constraint := rel.ParseConstraint(); constraint != nil && constraint.Name == name { + fmt.Println(fmt.Sprintf("SHREWS --Out of Guess for relation 0 %v", constraint)) return constraint, getTable(rel) } } @@ -728,6 +729,7 @@ func (m Migrator) GuessConstraintInterfaceAndTable(stmt *gorm.Statement, name st for k := range checkConstraints { if checkConstraints[k].Field == field { v := checkConstraints[k] + fmt.Println(fmt.Sprintf("SHREWS --Out of Guess for check %v", &v)) return &v, stmt.Table } } @@ -735,12 +737,14 @@ func (m Migrator) GuessConstraintInterfaceAndTable(stmt *gorm.Statement, name st for k := range uniqueConstraints { if uniqueConstraints[k].Field == field { v := uniqueConstraints[k] + fmt.Println(fmt.Sprintf("SHREWS --Out of Guess for unique %v", &v)) return &v, stmt.Table } } for _, rel := range stmt.Schema.Relationships.Relations { if constraint := rel.ParseConstraint(); constraint != nil && rel.Field == field { + fmt.Println(fmt.Sprintf("SHREWS --Out of Guess for relation %v", constraint)) return constraint, getTable(rel) } } @@ -767,7 +771,11 @@ func (m Migrator) CreateConstraint(value interface{}, name string) error { // DropConstraint drop constraint func (m Migrator) DropConstraint(value interface{}, name string) error { + fmt.Println(fmt.Sprintf("SHREWS --In Drop %q", name)) return m.RunWithValue(value, func(stmt *gorm.Statement) error { + if !m.HasConstraint(value, name) { + return nil + } constraint, table := m.GuessConstraintInterfaceAndTable(stmt, name) if constraint != nil { name = constraint.GetName() diff --git a/tests/migrate_test.go b/tests/migrate_test.go index e04a42fb..8ac37260 100644 --- a/tests/migrate_test.go +++ b/tests/migrate_test.go @@ -809,6 +809,10 @@ func TestMigrateConstraint(t *testing.T) { DB.Migrator().CreateConstraint(&User{}, name) } + if !DB.Migrator().HasConstraint(&User{}, name) { + t.Fatalf("failed to create constraint %v", name) + } + if err := DB.Migrator().DropConstraint(&User{}, name); err != nil { t.Fatalf("failed to drop constraint %v, got error %v", name, err) }