链接mysql
package main
import (
"time"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
"gorm.io/plugin/dbresolver"
)
var _db *gorm.DB
func main() {
pathR := "root:12345@(127.0.0.1:3306)/hcl1?chartset=utf8&parseTime=true"
pathW := "root:12345@(127.0.0.1:3306)/hcl2?chartset=utf8&parseTime=true"
ormLoger := logger.Default
db, _ := gorm.Open(mysql.New(mysql.Config{
DSN: pathR, // source name
DefaultStringSize: 256, // string 类型字段的默认长度
DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
DontSupportRenameColumn: true, // 不支持重命名列
SkipInitializeWithVersion: false, // 根据版本自动配置
}), &gorm.Config{
Logger: ormLoger,
NamingStrategy: schema.NamingStrategy{ // 命名策略
SingularTable: true,
},
})
sqlDB, _ := db.DB()
sqlDB.SetMaxIdleConns(20) //设置连接池,允许最大空闲数量
sqlDB.SetMaxOpenConns(100) //允许最大打开数量
sqlDB.SetConnMaxLifetime(time.Second * 30) // 过期时间
_db = db
// 主从配置 (dbresolver是主从配置插件)
_db.Use(dbresolver.
Register(dbresolver.Config{
// `db1` 作为 sources,`db2`、`db3` 作为 replicas
Sources: []gorm.Dialector{mysql.Open(pathW)}, // 写操作
Replicas: []gorm.Dialector{mysql.Open(pathR), mysql.Open(pathR)}, // 读操作
Policy: dbresolver.RandomPolicy{}, // sources/replicas 负载均衡策略
}))
Migration()
}
func NewDBClient(ctx context.Context) *gorm.DB {
db := _db
return db.WithContext(ctx)
}
数据迁移
// 自动迁移
// 执行数据迁移 utf8mb4是utf8的超集,mb4是专门来兼容四字节的unicode,mysql只支持utf8最大字符长度为3字节,如果遇到4字节的宽字符就会插入异常了。
func Migration() {
err := _db.Set("gorm:table_options", "charset=utf8mb4").AutoMigrate(
&model.User{},
&model.Product{},
)
if err != nil {
log.Println("register table fail")
os.Exit(0)
}
log.Println("register table success")
}