package dao
import (
"fmt"
"mall/model"
)
func migration() {
err := _db.Set("grom:table_options", "charset=utf8mb4").
AutoMigrate(
&model.User{},
&model.Address{},
&model.Admin{},
)
if err != nil {
fmt.Println("err", err)
}
}
package dao
import (
"context"
"time"
"github.com/gin-gonic/gin"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
"gorm.io/plugin/dbresolver"
)
var _db *gorm.DB
func Database(connRead, connWrite string) {
//1.配置日志
var ormLogger logger.Interface
if gin.Mode() == "debug" {
//默认
ormLogger = logger.Default.LogMode(logger.Info)
} else {
ormLogger = logger.Default
}
//2.gorm 连接mysql数据库
db, err := gorm.Open(mysql.New(mysql.Config{
DSN: connRead,
DefaultStringSize: 256, //string类型字段默认长度
DisableDatetimePrecision: true, //进展datatime精度 5.6之前的数据库不支持
DontSupportRenameIndex: true, //重命名索引,就要把索引先删掉再重建,mysql5,。7不支持
DontSupportRenameColumn: true, //用change重命名索引,mysql 8之前不支持
SkipInitializeWithVersion: false,
}), &gorm.Config{
Logger: ormLogger,
NamingStrategy: schema.NamingStrategy{
//命名策略不加s
SingularTable: true,
},
})
if err != nil {
return
}
sqlDB, _ := db.DB()
sqlDB.SetMaxOpenConns(20) //设置连接池
sqlDB.SetMaxOpenConns(100)
sqlDB.SetConnMaxLifetime(time.Second * 30)
_db = db
//3.主从配置
_db.Use(dbresolver.
Register(dbresolver.Config{
Sources: []gorm.Dialector{mysql.Open(connWrite)}, //写
Replicas: []gorm.Dialector{mysql.Open(connRead), mysql.Open(connWrite)}, //读
Policy: dbresolver.RandomPolicy{},
}))
migration()
}
func NewDBClient(ctx context.Context) *gorm.DB {
db := _db
return db.WithContext(ctx)
}
package conf
import (
"mall/dao"
"strings"
"gopkg.in/go-ini/ini.v1"
)
var (
AppModel string
HttpPort string
Db string
DbHost string
DbPort string
DbUser string
DbPassword string
DbName string
)
func Init() {
//本地读取环境变量
file, err := ini.Load("./conf/config.ini")
if err != nil {
panic(err)
}
LoadMysql(file)
//mysql读写分离
//mysql 读(8) 作为主
pathRead := strings.Join([]string{DbUser, ":", DbPassword, "@tcp(", DbHost, ":", DbPort, ")/", DbName, "?charset=utf8mb4&parseTime=true"}, "")
//mysql 写(2) 作为从 主从复制
pathWrite := strings.Join([]string{DbUser, ":", DbPassword, "@tcp(", DbHost, ":", DbPort, ")/", DbName, "?charset=utf8mb4&parseTime=true"}, "")
//传入dao层
dao.Database(pathRead, pathWrite)
}
func LoadMysql(file *ini.File) {
Db = file.Section("mysql").Key("DB").String()
DbHost = file.Section("mysql").Key("DbHost").String()
DbPort = file.Section("mysql").Key("DbPort").String()
DbUser = file.Section("mysql").Key("DbUser").String()
DbPassword = file.Section("mysql").Key("DbPassword").String()
DbName = file.Section("mysql").Key("DbName").String()
}