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
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 ""
|
|
}
|
|
|