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