Refactor check HasTable, HasColumn

This commit is contained in:
Jinzhu 2015-02-28 17:01:27 +08:00
parent da8fc53c86
commit 4e8d43dd4f
8 changed files with 20 additions and 55 deletions

View File

@ -86,26 +86,16 @@ func (s *commonDialect) databaseName(scope *Scope) string {
func (s *commonDialect) HasTable(scope *Scope, tableName string) bool { func (s *commonDialect) HasTable(scope *Scope, tableName string) bool {
var count int var count int
newScope := scope.New(nil) scope.NewDB().Raw("SELECT count(*) FROM INFORMATION_SCHEMA.tables WHERE table_name = ? AND table_schema = ?", tableName, s.databaseName(scope)).Row().Scan(&count)
newScope.Raw(fmt.Sprintf("SELECT count(*) FROM INFORMATION_SCHEMA.tables where table_name = %v AND table_schema = %v",
newScope.AddToVars(tableName),
newScope.AddToVars(s.databaseName(scope))))
newScope.SqlDB().QueryRow(newScope.Sql, newScope.SqlVars...).Scan(&count)
return count > 0 return count > 0
} }
func (s *commonDialect) HasColumn(scope *Scope, tableName string, columnName string) bool { func (s *commonDialect) HasColumn(scope *Scope, tableName string, columnName string) bool {
var count int var count int
newScope := scope.New(nil) scope.NewDB().Raw("SELECT count(*) FROM information_schema.columns WHERE table_schema = ? AND table_name = ? AND column_name = ?", s.databaseName(scope), tableName, columnName).Row().Scan(&count)
newScope.Raw(fmt.Sprintf("SELECT count(*) FROM information_schema.columns WHERE table_schema = %v AND table_name = %v AND column_name = %v",
newScope.AddToVars(s.databaseName(scope)),
newScope.AddToVars(tableName),
newScope.AddToVars(columnName),
))
newScope.SqlDB().QueryRow(newScope.Sql, newScope.SqlVars...).Scan(&count)
return count > 0 return count > 0
} }
func (s *commonDialect) RemoveIndex(scope *Scope, indexName string) { func (s *commonDialect) RemoveIndex(scope *Scope, indexName string) {
scope.Raw(fmt.Sprintf("DROP INDEX %v ON %v", indexName, scope.QuotedTableName())).Exec() scope.NewDB().Exec(fmt.Sprintf("DROP INDEX %v ON %v", indexName, scope.QuotedTableName()))
} }

View File

@ -35,7 +35,7 @@ func init() {
DB, err = gorm.Open("mysql", "gorm:gorm@/gorm?charset=utf8&parseTime=True") DB, err = gorm.Open("mysql", "gorm:gorm@/gorm?charset=utf8&parseTime=True")
case "postgres": case "postgres":
fmt.Println("testing postgres...") fmt.Println("testing postgres...")
DB, err = gorm.Open("postgres", "user=gorm DB.ame=gorm sslmode=disable") DB, err = gorm.Open("postgres", "user=gorm DB.name=gorm sslmode=disable")
case "mssql": case "mssql":
fmt.Println("testing mssql...") fmt.Println("testing mssql...")
DB, err = gorm.Open("mssql", "server=SERVER_HERE;database=rogue;user id=USER_HERE;password=PW_HERE;port=1433") DB, err = gorm.Open("mssql", "server=SERVER_HERE;database=rogue;user id=USER_HERE;password=PW_HERE;port=1433")

View File

@ -7,7 +7,7 @@ import (
) )
func runMigration() { func runMigration() {
if err := DB.DropTable(&User{}).Error; err != nil { if err := DB.DropTableIfExists(&User{}).Error; err != nil {
fmt.Printf("Got error when try to delete table users, %+v\n", err) fmt.Printf("Got error when try to delete table users, %+v\n", err)
} }

View File

@ -88,26 +88,16 @@ func (s *mssql) databaseName(scope *Scope) string {
func (s *mssql) HasTable(scope *Scope, tableName string) bool { func (s *mssql) HasTable(scope *Scope, tableName string) bool {
var count int var count int
newScope := scope.New(nil) scope.NewDB().Raw("SELECT count(*) FROM INFORMATION_SCHEMA.tables WHERE table_name = ? AND table_catalog = ?", tableName, s.databaseName(scope)).Row().Scan(&count)
newScope.Raw(fmt.Sprintf("SELECT count(*) FROM INFORMATION_SCHEMA.tables where table_name = %v AND table_catalog = %v",
newScope.AddToVars(tableName),
newScope.AddToVars(s.databaseName(scope))))
newScope.SqlDB().QueryRow(newScope.Sql, newScope.SqlVars...).Scan(&count)
return count > 0 return count > 0
} }
func (s *mssql) HasColumn(scope *Scope, tableName string, columnName string) bool { func (s *mssql) HasColumn(scope *Scope, tableName string, columnName string) bool {
var count int var count int
newScope := scope.New(nil) scope.NewDB().Raw("SELECT count(*) FROM information_schema.columns WHERE table_catalog = ? AND table_name = ? AND column_name = ?", s.databaseName(scope), tableName, columnName).Row().Scan(&count)
newScope.Raw(fmt.Sprintf("SELECT count(*) FROM information_schema.columns WHERE TABLE_CATALOG = %v AND table_name = %v AND column_name = %v",
newScope.AddToVars(s.databaseName(scope)),
newScope.AddToVars(tableName),
newScope.AddToVars(columnName),
))
newScope.SqlDB().QueryRow(newScope.Sql, newScope.SqlVars...).Scan(&count)
return count > 0 return count > 0
} }
func (s *mssql) RemoveIndex(scope *Scope, indexName string) { func (s *mssql) RemoveIndex(scope *Scope, indexName string) {
scope.Raw(fmt.Sprintf("DROP INDEX %v ON %v", indexName, scope.QuotedTableName())).Exec() scope.NewDB().Exec(fmt.Sprintf("DROP INDEX %v ON %v", indexName, scope.QuotedTableName()))
} }

View File

@ -86,26 +86,16 @@ func (s *mysql) databaseName(scope *Scope) string {
func (s *mysql) HasTable(scope *Scope, tableName string) bool { func (s *mysql) HasTable(scope *Scope, tableName string) bool {
var count int var count int
newScope := scope.New(nil) scope.NewDB().Raw("SELECT count(*) FROM INFORMATION_SCHEMA.tables where table_name = ? AND table_schema = ?", tableName, s.databaseName(scope)).Row().Scan(&count)
newScope.Raw(fmt.Sprintf("SELECT count(*) FROM INFORMATION_SCHEMA.tables where table_name = %v AND table_schema = %v",
newScope.AddToVars(tableName),
newScope.AddToVars(s.databaseName(scope))))
newScope.SqlDB().QueryRow(newScope.Sql, newScope.SqlVars...).Scan(&count)
return count > 0 return count > 0
} }
func (s *mysql) HasColumn(scope *Scope, tableName string, columnName string) bool { func (s *mysql) HasColumn(scope *Scope, tableName string, columnName string) bool {
var count int var count int
newScope := scope.New(nil) scope.NewDB().Raw("SELECT count(*) FROM information_schema.columns WHERE table_schema = ? AND table_name = ? AND column_name = ?", s.databaseName(scope), tableName, columnName).Row().Scan(&count)
newScope.Raw(fmt.Sprintf("SELECT count(*) FROM information_schema.columns WHERE table_schema = %v AND table_name = %v AND column_name = %v",
newScope.AddToVars(s.databaseName(scope)),
newScope.AddToVars(tableName),
newScope.AddToVars(columnName),
))
newScope.SqlDB().QueryRow(newScope.Sql, newScope.SqlVars...).Scan(&count)
return count > 0 return count > 0
} }
func (s *mysql) RemoveIndex(scope *Scope, indexName string) { func (s *mysql) RemoveIndex(scope *Scope, indexName string) {
scope.Raw(fmt.Sprintf("DROP INDEX %v ON %v", indexName, scope.QuotedTableName())).Exec() scope.NewDB().Exec(fmt.Sprintf("DROP INDEX %v ON %v", indexName, scope.QuotedTableName()))
} }

View File

@ -81,25 +81,18 @@ func (s *postgres) Quote(key string) string {
func (s *postgres) HasTable(scope *Scope, tableName string) bool { func (s *postgres) HasTable(scope *Scope, tableName string) bool {
var count int var count int
newScope := scope.New(nil) scope.NewDB().Raw("SELECT count(*) FROM INFORMATION_SCHEMA.tables WHERE table_name = ? AND table_type = 'BASE TABLE'", tableName).Row().Scan(&count)
newScope.Raw(fmt.Sprintf("SELECT count(*) FROM INFORMATION_SCHEMA.tables where table_name = %v and table_type = 'BASE TABLE'", newScope.AddToVars(tableName)))
newScope.SqlDB().QueryRow(newScope.Sql, newScope.SqlVars...).Scan(&count)
return count > 0 return count > 0
} }
func (s *postgres) HasColumn(scope *Scope, tableName string, columnName string) bool { func (s *postgres) HasColumn(scope *Scope, tableName string, columnName string) bool {
var count int var count int
newScope := scope.New(nil) scope.NewDB().Raw("SELECT count(*) FROM information_schema.columns WHERE table_name = ? AND column_name = ?", tableName, columnName).Row().Scan(&count)
newScope.Raw(fmt.Sprintf("SELECT count(*) FROM information_schema.columns WHERE table_name = %v AND column_name = %v",
newScope.AddToVars(tableName),
newScope.AddToVars(columnName),
))
newScope.SqlDB().QueryRow(newScope.Sql, newScope.SqlVars...).Scan(&count)
return count > 0 return count > 0
} }
func (s *postgres) RemoveIndex(scope *Scope, indexName string) { func (s *postgres) RemoveIndex(scope *Scope, indexName string) {
scope.Raw(fmt.Sprintf("DROP INDEX %v", s.Quote(indexName))).Exec() scope.NewDB().Exec(fmt.Sprintf("DROP INDEX %v", indexName))
} }
var hstoreType = reflect.TypeOf(Hstore{}) var hstoreType = reflect.TypeOf(Hstore{})

View File

@ -471,7 +471,9 @@ func (scope *Scope) dropTable() *Scope {
} }
func (scope *Scope) dropTableIfExists() *Scope { func (scope *Scope) dropTableIfExists() *Scope {
scope.Raw(fmt.Sprintf("DROP TABLE IF EXISTS %v", scope.QuotedTableName())).Exec() if scope.Dialect().HasTable(scope, scope.TableName()) {
scope.dropTable()
}
return scope return scope
} }

View File

@ -70,16 +70,16 @@ func (s *sqlite3) Quote(key string) string {
func (s *sqlite3) HasTable(scope *Scope, tableName string) bool { func (s *sqlite3) HasTable(scope *Scope, tableName string) bool {
var count int var count int
scope.SqlDB().QueryRow(fmt.Sprintf("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='%v';", tableName)).Scan(&count) scope.NewDB().Raw("SELECT count(*) FROM sqlite_master WHERE type='table' AND name=?", tableName).Row().Scan(&count)
return count > 0 return count > 0
} }
func (s *sqlite3) HasColumn(scope *Scope, tableName string, columnName string) bool { func (s *sqlite3) HasColumn(scope *Scope, tableName string, columnName string) bool {
var count int var count int
scope.SqlDB().QueryRow(fmt.Sprintf("SELECT count(*) FROM sqlite_master WHERE tbl_name = '%v' AND (sql LIKE '%%(\"%v\" %%' OR sql LIKE '%%,\"%v\" %%' OR sql LIKE '%%( %v %%' OR sql LIKE '%%, %v %%');\n", tableName, columnName, columnName, columnName, columnName)).Scan(&count) scope.NewDB().Raw(fmt.Sprintf("SELECT count(*) FROM sqlite_master WHERE tbl_name = ? AND (sql LIKE '%%(\"%v\" %%' OR sql LIKE '%%,\"%v\" %%' OR sql LIKE '%%( %v %%' OR sql LIKE '%%, %v %%');\n", columnName, columnName, columnName, columnName), tableName).Row().Scan(&count)
return count > 0 return count > 0
} }
func (s *sqlite3) RemoveIndex(scope *Scope, indexName string) { func (s *sqlite3) RemoveIndex(scope *Scope, indexName string) {
scope.Raw(fmt.Sprintf("DROP INDEX %v", indexName)).Exec() scope.NewDB().Exec(fmt.Sprintf("DROP INDEX %v", indexName))
} }