gorm_mysql.go 2.7 KB

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