低空智控平台 后端go
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

87 lines
2.0 KiB

package common
import (
"errors"
"strings"
"time"
"laic-backend/logger"
mysql_ "github.com/go-sql-driver/mysql"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var DB *gorm.DB
var err error
func InitConnection(config *Mysql) {
url := config.Url
if !strings.Contains(url, "loc=") && !strings.Contains(url, "time_zone=") {
if strings.Contains(url, "?") {
url += "&loc=Local"
} else {
url += "?loc=Local"
}
}
idle := config.Idle
maxConn := config.MaxConn
maxWait := time.Duration(config.MaxWait)
logger.DEBUG("mysql config:", config)
gConfig := &gorm.Config{
Logger: logger.NewGormLogger(),
}
DB, err = gorm.Open(mysql.Open(url), gConfig)
if err != nil {
logger.ERROR("mysql connect error", err)
panic(err)
}
DB = DB.Debug()
sqlDB, err := DB.DB()
if err != nil {
logger.ERROR("init mysql data pool error", err)
panic(err)
}
sqlDB.SetMaxIdleConns(idle)
sqlDB.SetMaxOpenConns(maxConn)
sqlDB.SetConnMaxLifetime(maxWait * time.Second)
logger.INFO("mysql ready")
}
type Pagination struct {
PageNum int64 `json:"pageNum" form:"pageNum" binding:"required" minimum:"1"`
PageSize int64 `json:"pageSize" form:"pageSize" binding:"required" minimum:"1"`
}
func (p *Pagination) Paginate(db *gorm.DB) *gorm.DB {
offset := int((p.PageNum - 1) * p.PageSize)
return db.Offset(offset).Limit(int(p.PageSize))
}
// ParseError 解析 MySQL 唯一键冲突等错误,返回错误号和约束名
func ParseError(err error) (uint16, string) {
if err != nil {
var mysqlErr *mysql_.MySQLError
if errors.As(err, &mysqlErr) {
if mysqlErr.Number == 1062 {
return mysqlErr.Number, extractConstraintName(mysqlErr.Message)
}
return mysqlErr.Number, ""
} else {
logger.ERROR("未知错误,gorm error:", err)
}
}
return 0, ""
}
func extractConstraintName(errMsg string) string {
start := strings.LastIndex(errMsg, "for key '") + len("for key '")
end := strings.LastIndex(errMsg, "'")
if start < end {
return errMsg[start:end]
}
return ""
}