发现有一些golang的项目中,有通过分析数据库报出来的错误信息来进行后续逻辑处理的。比如通过strings.Contains(err.Error(), “doesn’t exist”),来判断某个表不存在。这种方式不够强壮,最佳方式是通过错误码,如例子:
package main
import (
"database/sql"
"fmt"
"github.com/VividCortex/mysqlerr"
"github.com/go-sql-driver/mysql"
)
var (
ERRNO_TABLE_DOES_NOT_EXIST uint16 = 1146
)
func TagTableExists(table string) bool {
db, err := sql.Open("mysql", "user:password@tcp(localhost)/db")
if err != nil {
panic(err.Error())
}
stmtIns, err := db.Prepare(fmt.Sprintf("desc %s", table))
if err != nil {
panic(err.Error())
}
defer stmtIns.Close()
_, err = stmtIns.Exec()
if err != nil {
if driverError, ok := err.(*mysql.MySQLError); ok {
if driverError.Number == mysqlerr.ER_NO_SUCH_TABLE {
return false
}
}
panic(err.Error())
}
return true
}
func main() {
fmt.Println(TagTableExists("sometable"))
}
参考文档