db.go 3.8 KB

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