Go语言GORM 2.0的使用教程

GORM 2.0使用教程

GORM1.X用过有一段时间了,感觉Go生态MySQL的ORM还是不太成熟的,有一些特性使用起来还是觉得不太顺手,GORM算是比较好用的了,目前使用的人也比较多

这是main.go项目初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
func init() {
if err := initialize.InitConfig(); err != nil {
panic(err)
}
if err := initialize.InitLogger(); err != nil {
panic(err)
}
if err := initialize.InitDB(); err != nil {
panic(err)
}
if err := initialize.InitRedis(); err != nil {
panic(err)
}
}
这是GORM初始化的代码,注意GORM 2.0,Tag是2.0,实际上目前的版本还是1.23.x的版本
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
/**
* @Author: hqd8080
* @Description: mysql
* @Date: 2022-03-21 09:30
*/

package initialize

import (
"fmt"
"log"
"os"
"time"

"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
)

var DB *gorm.DB

func InitDB() error {
var err error
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
DatabaseConfig.Username,
DatabaseConfig.Password,
DatabaseConfig.Host,
DatabaseConfig.Port,
DatabaseConfig.Name,
)
config := mysql.New(mysql.Config{
DriverName: "mysql", // mysql
DSN: dsn, // dsn
SkipInitializeWithVersion: false, // 根据版本自动配置
DefaultStringSize: 256, // 设置string类型字段的默认长度
})

logger := logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags),
logger.Config{
SlowThreshold: time.Second * 1, // 慢SQL阈值
Colorful: true, // 开启彩色打印
IgnoreRecordNotFoundError: false, // 忽略未找到记录错误
LogLevel: logger.Info, // 设置日志级别
},
)
opts := &gorm.Config{
DisableForeignKeyConstraintWhenMigrating: true, // 迁移时禁用外键约束
PrepareStmt: true,
Logger: logger, // 日志配置
NamingStrategy: schema.NamingStrategy{
TablePrefix: "t_", // 设置表前缀
SingularTable: true, // 使用单数表名
NameReplacer: nil,
NoLowerCase: false,
},
}
db, err := gorm.Open(config, opts)
if err != nil {
return fmt.Errorf("connection to db err:%v", err)
}
sqlDB, err := db.DB()
if err != nil {
return fmt.Errorf("get db conn err:%v", err)
}
sqlDB.SetMaxOpenConns(int(DatabaseConfig.MaxOpenConn)) // 打开数据库连接的最大数量
sqlDB.SetConnMaxIdleTime(time.Hour) //
sqlDB.SetMaxIdleConns(int(DatabaseConfig.MaxIdleConn)) // 空闲连接池中连接的最大数量
sqlDB.SetConnMaxLifetime(time.Hour) // 连接可复用的最大时间
DB = db
log.Println("init db connection success")
return err
}