| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- package core
- import (
- "fmt"
- _ "github.com/go-sql-driver/mysql"
- config2 "go_server/base/config"
- "gorm.io/driver/mysql"
- "gorm.io/gorm"
- "gorm.io/gorm/logger"
- "gorm.io/gorm/schema"
- "time"
- )
- func MainDb() *gorm.DB {
- return gormMysqlByConfig(config2.EnvConf().Mysql)
- }
- func BizDbs() (map[string]*gorm.DB, map[string]string, map[string]string) {
- dbMap := make(map[string]*gorm.DB)
- aliasDBMap := make(map[string]string)
- aliasProxyMap := make(map[string]string)
- for _, info := range config2.EnvConf().BizList {
- // 通过别名获取 db
- dbMap[info.AliasName] = gormMysqlByConfig(config2.Mysql{GeneralDB: info.GeneralDB})
- aliasDBMap[info.AliasName] = info.Dbname // 通过db名 获取别名
- aliasProxyMap[info.ProxyAlias] = info.ProxyUrl // 别名 - 代理映射
- // 别名/db名 获取对应的业务请求地址
- }
- return dbMap, aliasDBMap, aliasProxyMap
- }
- func gormMysqlByConfig(m config2.Mysql) *gorm.DB {
- dialer := mysql.New(mysql.Config{
- DSN: m.Dsn(), // DSN data source name
- DefaultStringSize: 256, // string 类型字段的默认长度
- DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
- DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
- DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
- SkipInitializeWithVersion: false, // 根据版本自动配置
- })
- db, err := gorm.Open(dialer, gormConfig(m.Prefix, m.Singular))
- if err != nil {
- panic(err)
- }
- db.InstanceSet("gorm:table_options", "ENGINE=InnoDB")
- sqlDB, _ := db.DB()
- sqlDB.SetConnMaxIdleTime(20 * time.Second)
- sqlDB.SetConnMaxLifetime(20 * time.Second)
- sqlDB.SetMaxIdleConns(m.MaxIdleConns)
- sqlDB.SetMaxOpenConns(m.MaxOpenConns)
- err = sqlDB.Ping()
- if err != nil {
- panic(err)
- }
- return db
- }
- // Config gorm 自定义配置
- func gormConfig(prefix string, singular bool) *gorm.Config {
- var general config2.GeneralDB
- general = config2.EnvConf().Mysql.GeneralDB
- return &gorm.Config{
- Logger: logger.New(NewWriter(general), logger.Config{
- SlowThreshold: 200 * time.Millisecond,
- LogLevel: general.LogLevel(),
- Colorful: true,
- }),
- NamingStrategy: schema.NamingStrategy{
- TablePrefix: prefix,
- SingularTable: singular,
- },
- DisableForeignKeyConstraintWhenMigrating: true,
- }
- }
- type Writer struct {
- config config2.GeneralDB
- writer logger.Writer
- }
- func NewWriter(config config2.GeneralDB) *Writer {
- return &Writer{config: config}
- }
- // Printf 格式化打印日志
- func (c *Writer) Printf(message string, data ...any) {
- // 当有日志时候均需要输出到控制台
- fmt.Printf(message, data...)
- // 当开启了zap的情况,会打印到日志记录
- if c.config.LogZap {
- switch c.config.LogLevel() {
- case logger.Silent:
- Log.Debug(fmt.Sprintf(message, data...))
- case logger.Error:
- Log.Error(fmt.Sprintf(message, data...))
- case logger.Warn:
- Log.Warn(fmt.Sprintf(message, data...))
- case logger.Info:
- Log.Info(fmt.Sprintf(message, data...))
- default:
- Log.Info(fmt.Sprintf(message, data...))
- }
- return
- }
- }
|