gorm_mysql.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package core
  2. import (
  3. "fmt"
  4. _ "github.com/go-sql-driver/mysql"
  5. config2 "go_server/base/config"
  6. "gorm.io/driver/mysql"
  7. "gorm.io/gorm"
  8. "gorm.io/gorm/logger"
  9. "gorm.io/gorm/schema"
  10. "time"
  11. )
  12. func MainDb() *gorm.DB {
  13. return gormMysqlByConfig(config2.EnvConf().Mysql)
  14. }
  15. func BizDbs() (map[string]*gorm.DB, map[string]string, map[string]string) {
  16. dbMap := make(map[string]*gorm.DB)
  17. aliasDBMap := make(map[string]string)
  18. aliasProxyMap := make(map[string]string)
  19. for _, info := range config2.EnvConf().BizList {
  20. // 通过别名获取 db
  21. dbMap[info.AliasName] = gormMysqlByConfig(config2.Mysql{GeneralDB: info.GeneralDB})
  22. aliasDBMap[info.AliasName] = info.Dbname // 通过db名 获取别名
  23. aliasProxyMap[info.ProxyAlias] = info.ProxyUrl // 别名 - 代理映射
  24. // 别名/db名 获取对应的业务请求地址
  25. }
  26. return dbMap, aliasDBMap, aliasProxyMap
  27. }
  28. func gormMysqlByConfig(m config2.Mysql) *gorm.DB {
  29. dialer := mysql.New(mysql.Config{
  30. DSN: m.Dsn(), // DSN data source name
  31. DefaultStringSize: 256, // string 类型字段的默认长度
  32. DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
  33. DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
  34. DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
  35. SkipInitializeWithVersion: false, // 根据版本自动配置
  36. })
  37. db, err := gorm.Open(dialer, gormConfig(m.Prefix, m.Singular))
  38. if err != nil {
  39. panic(err)
  40. }
  41. db.InstanceSet("gorm:table_options", "ENGINE=InnoDB")
  42. sqlDB, _ := db.DB()
  43. sqlDB.SetConnMaxIdleTime(20 * time.Second)
  44. sqlDB.SetConnMaxLifetime(20 * time.Second)
  45. sqlDB.SetMaxIdleConns(m.MaxIdleConns)
  46. sqlDB.SetMaxOpenConns(m.MaxOpenConns)
  47. err = sqlDB.Ping()
  48. if err != nil {
  49. panic(err)
  50. }
  51. return db
  52. }
  53. // Config gorm 自定义配置
  54. func gormConfig(prefix string, singular bool) *gorm.Config {
  55. var general config2.GeneralDB
  56. general = config2.EnvConf().Mysql.GeneralDB
  57. return &gorm.Config{
  58. Logger: logger.New(NewWriter(general), logger.Config{
  59. SlowThreshold: 200 * time.Millisecond,
  60. LogLevel: general.LogLevel(),
  61. Colorful: true,
  62. }),
  63. NamingStrategy: schema.NamingStrategy{
  64. TablePrefix: prefix,
  65. SingularTable: singular,
  66. },
  67. DisableForeignKeyConstraintWhenMigrating: true,
  68. }
  69. }
  70. type Writer struct {
  71. config config2.GeneralDB
  72. writer logger.Writer
  73. }
  74. func NewWriter(config config2.GeneralDB) *Writer {
  75. return &Writer{config: config}
  76. }
  77. // Printf 格式化打印日志
  78. func (c *Writer) Printf(message string, data ...any) {
  79. // 当有日志时候均需要输出到控制台
  80. fmt.Printf(message, data...)
  81. // 当开启了zap的情况,会打印到日志记录
  82. if c.config.LogZap {
  83. switch c.config.LogLevel() {
  84. case logger.Silent:
  85. Log.Debug(fmt.Sprintf(message, data...))
  86. case logger.Error:
  87. Log.Error(fmt.Sprintf(message, data...))
  88. case logger.Warn:
  89. Log.Warn(fmt.Sprintf(message, data...))
  90. case logger.Info:
  91. Log.Info(fmt.Sprintf(message, data...))
  92. default:
  93. Log.Info(fmt.Sprintf(message, data...))
  94. }
  95. return
  96. }
  97. }