From d81179557dfcc64a011e8198b3f2febe8a0c9a39 Mon Sep 17 00:00:00 2001 From: Jinzhu Date: Sun, 31 May 2020 10:24:49 +0800 Subject: [PATCH] Add tests for Tables --- dialects/mssql/migrator.go | 30 +++++++++++++++++++ migrator.go | 2 +- migrator/migrator.go | 27 +++++++++++++++-- tests/migrate_test.go | 59 +++++++++++++++++++++++++++++--------- 4 files changed, 102 insertions(+), 16 deletions(-) diff --git a/dialects/mssql/migrator.go b/dialects/mssql/migrator.go index 42a6b9b9..b334268e 100644 --- a/dialects/mssql/migrator.go +++ b/dialects/mssql/migrator.go @@ -23,6 +23,36 @@ func (m Migrator) HasTable(value interface{}) bool { return count > 0 } +func (m Migrator) RenameTable(oldName, newName interface{}) error { + var oldTable, newTable string + if v, ok := oldName.(string); ok { + oldTable = v + } else { + stmt := &gorm.Statement{DB: m.DB} + if err := stmt.Parse(oldName); err == nil { + oldTable = stmt.Table + } else { + return err + } + } + + if v, ok := newName.(string); ok { + newTable = v + } else { + stmt := &gorm.Statement{DB: m.DB} + if err := stmt.Parse(newName); err == nil { + newTable = stmt.Table + } else { + return err + } + } + + return m.DB.Exec( + "sp_rename @objname = ?, @newname = ?;", + clause.Table{Name: oldTable}, clause.Table{Name: newTable}, + ).Error +} + func (m Migrator) HasColumn(value interface{}, field string) bool { var count int64 m.RunWithValue(value, func(stmt *gorm.Statement) error { diff --git a/migrator.go b/migrator.go index d90c362f..865a08ef 100644 --- a/migrator.go +++ b/migrator.go @@ -27,7 +27,7 @@ type Migrator interface { CreateTable(dst ...interface{}) error DropTable(dst ...interface{}) error HasTable(dst interface{}) bool - RenameTable(oldName, newName string) error + RenameTable(oldName, newName interface{}) error // Columns AddColumn(dst interface{}, field string) error diff --git a/migrator/migrator.go b/migrator/migrator.go index d41646f4..f22d6d2c 100644 --- a/migrator/migrator.go +++ b/migrator/migrator.go @@ -227,8 +227,31 @@ func (m Migrator) HasTable(value interface{}) bool { return count > 0 } -func (m Migrator) RenameTable(oldName, newName string) error { - return m.DB.Exec("RENAME TABLE ? TO ?", oldName, newName).Error +func (m Migrator) RenameTable(oldName, newName interface{}) error { + var oldTable, newTable string + if v, ok := oldName.(string); ok { + oldTable = v + } else { + stmt := &gorm.Statement{DB: m.DB} + if err := stmt.Parse(oldName); err == nil { + oldTable = stmt.Table + } else { + return err + } + } + + if v, ok := newName.(string); ok { + newTable = v + } else { + stmt := &gorm.Statement{DB: m.DB} + if err := stmt.Parse(newName); err == nil { + newTable = stmt.Table + } else { + return err + } + } + + return m.DB.Exec("ALTER TABLE ? RENAME TO ?", clause.Table{Name: oldTable}, clause.Table{Name: newTable}).Error } func (m Migrator) AddColumn(value interface{}, field string) error { diff --git a/tests/migrate_test.go b/tests/migrate_test.go index 2252d09d..748ee816 100644 --- a/tests/migrate_test.go +++ b/tests/migrate_test.go @@ -15,20 +15,53 @@ func TestMigrate(t *testing.T) { rand.Shuffle(len(allModels), func(i, j int) { allModels[i], allModels[j] = allModels[j], allModels[i] }) if err := DB.Migrator().DropTable(allModels...); err != nil { - t.Errorf("Failed to drop table, got error %v", err) + t.Fatalf("Failed to drop table, got error %v", err) } if err := DB.AutoMigrate(allModels...); err != nil { - t.Errorf("Failed to auto migrate, but got error %v", err) + t.Fatalf("Failed to auto migrate, but got error %v", err) } for _, m := range allModels { if !DB.Migrator().HasTable(m) { - t.Errorf("Failed to create table for %#v", m) + t.Fatalf("Failed to create table for %#v", m) } } } +func TestTable(t *testing.T) { + type TableStruct struct { + gorm.Model + Name string + } + + DB.Migrator().DropTable(&TableStruct{}) + DB.AutoMigrate(&TableStruct{}) + + if !DB.Migrator().HasTable(&TableStruct{}) { + t.Fatalf("should found created table") + } + + type NewTableStruct struct { + gorm.Model + Name string + } + + if err := DB.Migrator().RenameTable(&TableStruct{}, &NewTableStruct{}); err != nil { + t.Fatalf("Failed to rename table, got error %v", err) + } + + if !DB.Migrator().HasTable("new_table_structs") { + t.Fatal("should found renamed table") + } + + DB.Migrator().DropTable("new_table_structs") + + if DB.Migrator().HasTable(&NewTableStruct{}) { + t.Fatal("should not found droped table") + } +} + func TestIndexes(t *testing.T) { type IndexStruct struct { gorm.Model @@ -39,43 +72,43 @@ func TestIndexes(t *testing.T) { DB.AutoMigrate(&IndexStruct{}) if err := DB.Migrator().DropIndex(&IndexStruct{}, "Name"); err != nil { - t.Errorf("Failed to drop index for user's name, got err %v", err) + t.Fatalf("Failed to drop index for user's name, got err %v", err) } if err := DB.Migrator().CreateIndex(&IndexStruct{}, "Name"); err != nil { - t.Errorf("Got error when tried to create index: %+v", err) + t.Fatalf("Got error when tried to create index: %+v", err) } if !DB.Migrator().HasIndex(&IndexStruct{}, "Name") { - t.Errorf("Failed to find index for user's name") + t.Fatalf("Failed to find index for user's name") } if err := DB.Migrator().DropIndex(&IndexStruct{}, "Name"); err != nil { - t.Errorf("Failed to drop index for user's name, got err %v", err) + t.Fatalf("Failed to drop index for user's name, got err %v", err) } if DB.Migrator().HasIndex(&IndexStruct{}, "Name") { - t.Errorf("Should not find index for user's name after delete") + t.Fatalf("Should not find index for user's name after delete") } if err := DB.Migrator().CreateIndex(&IndexStruct{}, "Name"); err != nil { - t.Errorf("Got error when tried to create index: %+v", err) + t.Fatalf("Got error when tried to create index: %+v", err) } if err := DB.Migrator().RenameIndex(&IndexStruct{}, "idx_index_structs_name", "idx_users_name_1"); err != nil { - t.Errorf("no error should happen when rename index, but got %v", err) + t.Fatalf("no error should happen when rename index, but got %v", err) } if !DB.Migrator().HasIndex(&IndexStruct{}, "idx_users_name_1") { - t.Errorf("Should find index for user's name after rename") + t.Fatalf("Should find index for user's name after rename") } if err := DB.Migrator().DropIndex(&IndexStruct{}, "idx_users_name_1"); err != nil { - t.Errorf("Failed to drop index for user's name, got err %v", err) + t.Fatalf("Failed to drop index for user's name, got err %v", err) } if DB.Migrator().HasIndex(&IndexStruct{}, "idx_users_name_1") { - t.Errorf("Should not find index for user's name after delete") + t.Fatalf("Should not find index for user's name after delete") } }