db.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package bootstrap
  2. import (
  3. "designs/config"
  4. "designs/global"
  5. "fmt"
  6. "io"
  7. "log"
  8. "os"
  9. "time"
  10. "go.uber.org/zap"
  11. "gorm.io/driver/mysql"
  12. "gorm.io/gorm"
  13. "gorm.io/gorm/logger"
  14. )
  15. func InitializeDB() *gorm.DB {
  16. // 根据驱动配置进行初始化
  17. switch config.Get("database.driver") {
  18. case "mysql":
  19. return initMySqlGorm()
  20. default:
  21. return initMySqlGorm()
  22. }
  23. }
  24. func UnInitializeDB(db *gorm.DB) {
  25. if db != nil {
  26. if sqldb, err := db.DB(); err == nil {
  27. sqldb.Close()
  28. } else {
  29. global.App.Log.Errorf("close database failed: %v", err)
  30. }
  31. }
  32. }
  33. func initMySqlGorm() *gorm.DB {
  34. UserName := config.Get("database.userName")
  35. Password := config.Get("database.password")
  36. Host := config.Get("database.host")
  37. Port := config.Get("database.port")
  38. Database := config.Get("database.database")
  39. Charset := config.Get("database.charset")
  40. dsn := UserName + ":" + Password + "@tcp(" + Host + ":" + Port + ")/" +
  41. Database + "?charset=" + Charset + "&parseTime=True&loc=Local"
  42. mysqlConfig := mysql.Config{
  43. DSN: dsn, // DSN data source name
  44. DefaultStringSize: 191, // string 类型字段的默认长度
  45. DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
  46. DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
  47. DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
  48. SkipInitializeWithVersion: false, // 根据版本自动配置
  49. }
  50. if db, err := gorm.Open(mysql.New(mysqlConfig), &gorm.Config{
  51. DisableForeignKeyConstraintWhenMigrating: true, // 禁用自动创建外键约束
  52. Logger: getGormLogger(), // 使用自定义 Logger
  53. }); err != nil {
  54. global.App.Log.Error("mysql connect failed, err:", zap.Any("err", err))
  55. return nil
  56. } else {
  57. fmt.Println("mysql connect success")
  58. sqlDB, _ := db.DB()
  59. sqlDB.SetMaxIdleConns(config.GetInt("database.maxIdleConns"))
  60. sqlDB.SetMaxOpenConns(config.GetInt("database.maxOpenConns"))
  61. initMySqlTables(db)
  62. return db
  63. }
  64. }
  65. func getGormLogger() logger.Interface {
  66. var logMode logger.LogLevel
  67. switch config.Get("database.logMode") {
  68. case "silent":
  69. logMode = logger.Silent
  70. case "error":
  71. logMode = logger.Error
  72. case "warn":
  73. logMode = logger.Warn
  74. case "info":
  75. logMode = logger.Info
  76. default:
  77. logMode = logger.Info
  78. }
  79. return logger.New(getGormLogWriter(), logger.Config{
  80. SlowThreshold: 2 * time.Second, // 慢 SQL 阈值
  81. LogLevel: logMode, // 日志级别
  82. IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(记录未找到)错误
  83. Colorful: !config.GetBool("database.enableFileLogWriter"), // 禁用彩色打印
  84. })
  85. }
  86. // 自定义 gorm Writer
  87. func getGormLogWriter() logger.Writer {
  88. var writer io.Writer
  89. // 是否启用日志文件
  90. if config.GetBool("database.enableFileLogWriter") {
  91. // 自定义 Writer
  92. // writer = &lumberjack.Logger{
  93. // Filename: global.App.Config.Log.RootDir + "/" + global.App.Config.Database.LogFilename,
  94. // MaxSize: global.App.Config.Log.MaxSize,
  95. // MaxBackups: global.App.Config.Log.MaxBackups,
  96. // MaxAge: global.App.Config.Log.MaxAge,
  97. // Compress: global.App.Config.Log.Compress,
  98. // }
  99. if global.App.LogWriter == nil {
  100. panic("log writer is nil")
  101. }
  102. writer = global.App.LogWriter
  103. } else {
  104. // 默认 Writer
  105. writer = os.Stdout
  106. }
  107. return log.New(writer, "\r\n", log.LstdFlags)
  108. }
  109. // 数据库表初始化
  110. func initMySqlTables(db *gorm.DB) {
  111. err := db.AutoMigrate(
  112. // models.User{},
  113. // models.Media{},
  114. )
  115. if err != nil {
  116. global.App.Log.Error("migrate table failed", zap.Any("err", err))
  117. os.Exit(0)
  118. }
  119. }