-
Notifications
You must be signed in to change notification settings - Fork 0
/
db.go
131 lines (111 loc) · 2.4 KB
/
db.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package simple
import (
"github.com/jinzhu/gorm"
log "github.com/sirupsen/logrus"
)
type GormModel struct {
Id int64 `gorm:"PRIMARY_KEY;AUTO_INCREMENT" json:"id"`
}
type DBConfiguration struct {
Dialect string
Url string
MaxIdle int
MaxActive int
EnableLogModel bool
Models []interface{}
}
var db *gorm.DB
// 打开数据库
func OpenDB(conf *DBConfiguration) *gorm.DB {
gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string {
return "t_" + defaultTableName
}
var err error
db, err = gorm.Open(conf.Dialect, conf.Url)
db.SingularTable(true)
maxIdle := 10
if conf.MaxIdle > 0 {
maxIdle = conf.MaxIdle
}
db.DB().SetMaxIdleConns(maxIdle)
maxActive := 50
if conf.MaxActive > 0 {
maxActive = conf.MaxActive
}
db.DB().SetMaxOpenConns(maxActive)
db.LogMode(conf.EnableLogModel)
if err != nil {
log.Errorf("opens database failed: %s", err.Error())
}
if len(conf.Models) > 0 {
if err = db.AutoMigrate(conf.Models...).Error; nil != err {
log.Errorf("auto migrate tables failed: %s", err.Error())
}
}
return db
}
// 关闭连接
func CloseDB() {
if db == nil {
return
}
if err := db.Close(); nil != err {
log.Errorf("Disconnect from database failed: %s", err.Error())
}
}
// 获取数据库链接
func GetDB() *gorm.DB {
return db
}
// 事务环绕
func Tx(db *gorm.DB, txFunc func(tx *gorm.DB) error) (err error) {
tx := db.Begin()
if tx.Error != nil {
return
}
defer func() {
if r := recover(); r != nil {
tx.Rollback()
panic(r) // re-throw panic after Rollback
} else if err != nil {
tx.Rollback()
} else {
err = tx.Commit().Error
}
}()
err = txFunc(tx)
return err
}
// 排序信息
type OrderByCol struct {
Column string // 排序字段
Asc bool // 是否正序
}
// 分页返回数据
type PageResult struct {
Page *Paging `json:"page"` // 分页信息
Results interface{} `json:"results"` // 数据
}
// 分页请求数据
type Paging struct {
Page int `json:"page"` // 页码
Limit int `json:"limit"` // 每页条数
Total int `json:"total"` // 总数据条数
}
func (p *Paging) Offset() int {
offset := 0
if p.Page > 0 {
offset = (p.Page - 1) * p.Limit
}
return offset
}
func (p *Paging) TotalPage() int {
if p.Total == 0 || p.Limit == 0 {
return 0
}
totalPage := p.Total / p.Limit
if p.Total%p.Limit > 0 {
totalPage = totalPage + 1
}
return totalPage
}