/
mysql.go
104 lines (84 loc) · 1.73 KB
/
mysql.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package mysql
import (
"context"
sysLog "log"
"os"
"time"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"github.com/go-goim/core/pkg/graceful"
"github.com/go-goim/core/pkg/log"
)
var (
// default db
defaultDB *gorm.DB
)
func GetDB() *gorm.DB {
return defaultDB
}
func InitDB(opts ...Option) error {
var err error
defaultDB, err = NewMySQL(opts...)
if err != nil {
return err
}
graceful.Register(func(ctx context.Context) error {
err := Close()
if err != nil {
log.Error("mysql close error", "err", err)
}
return err
})
return nil
}
func NewMySQL(opts ...Option) (*gorm.DB, error) {
o := newOption()
o.apply(opts...)
if o.dsn == "" {
o.dsn = o.user + ":" + o.password + "@tcp(" + o.addr + ")/" + o.db + "?charset=utf8mb4&parseTime=True&loc=Local"
}
loggerConfig := logger.Config{
SlowThreshold: 1 * time.Second,
LogLevel: logger.Error,
IgnoreRecordNotFoundError: true,
}
if o.debug {
loggerConfig = logger.Config{
LogLevel: logger.Info,
}
}
slowLogger := logger.New(
sysLog.New(os.Stdout, "[MYSQL]", sysLog.LstdFlags),
loggerConfig,
)
gConf := &gorm.Config{
Logger: slowLogger,
SkipDefaultTransaction: true,
PrepareStmt: true,
}
gdb, err := gorm.Open(mysql.Open(o.dsn), gConf)
if err != nil {
return nil, err
}
sqlDB, err := gdb.DB()
if err != nil {
return nil, err
}
sqlDB.SetMaxIdleConns(o.maxIdleConns)
sqlDB.SetMaxOpenConns(o.maxConns)
sqlDB.SetConnMaxIdleTime(o.idleTimeout)
sqlDB.SetConnMaxLifetime(o.connMaxLifetime)
return gdb, nil
}
// Close db.
func Close() error {
if defaultDB != nil {
db, err := defaultDB.DB()
if err != nil {
return err
}
return db.Close()
}
return nil
}