init_db.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package db
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "time"
  7. "gorm.io/driver/mysql"
  8. "gorm.io/gorm/logger"
  9. "gorm.io/gorm/schema"
  10. "github.com/sirupsen/logrus"
  11. "github.com/spf13/viper"
  12. "gorm.io/gorm"
  13. )
  14. type Database struct {
  15. Self *gorm.DB
  16. }
  17. // 单例
  18. var DB *Database
  19. func InitTest() {
  20. viper.Set("gormlog", viper.GetBool("gormlog"))
  21. viper.Set("db.username", viper.GetString("test.db.username"))
  22. viper.Set("db.password", viper.GetString("test.db.password"))
  23. viper.Set("db.addr", viper.GetString("test.db.addr"))
  24. viper.Set("db.name", viper.GetString("test.db.name"))
  25. DB = &Database{
  26. Self: getDB(),
  27. }
  28. }
  29. func Init() {
  30. DB = &Database{
  31. Self: getDB(),
  32. }
  33. }
  34. func openDB(username, password, addr, name string) *gorm.DB {
  35. config := fmt.Sprintf(
  36. "%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=%t&loc=%s&timeout=%ds",
  37. username,
  38. password,
  39. addr,
  40. name,
  41. true,
  42. //"Asia%2FShanghai", // 必须是 url.QueryEscape 的
  43. "Local",
  44. 10,
  45. )
  46. logLevel := logger.Warn
  47. newLogger := logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags), logger.Config{
  48. SlowThreshold: 200 * time.Millisecond,
  49. LogLevel: logLevel,
  50. IgnoreRecordNotFoundError: false,
  51. Colorful: true,
  52. }).LogMode(logger.Error)
  53. // if viper.GetBool("gormlog") {
  54. // newLogger = logger.Default.LogMode(logger.Info)
  55. // }
  56. if viper.GetBool("gormlog") {
  57. newLogger = logger.Default.LogMode(logger.Info)
  58. }
  59. logrus.Info("config:", config)
  60. db, err := gorm.Open(mysql.Open(config), &gorm.Config{
  61. Logger: newLogger,
  62. NamingStrategy: schema.NamingStrategy{
  63. TablePrefix: viper.GetString("db.tableprefix"),
  64. SingularTable: viper.GetBool("db.singulartable"),
  65. },
  66. })
  67. if err != nil {
  68. logrus.Fatalf("数据库连接失败. 数据库名字: %s. 错误信息: %s", name, err)
  69. } else {
  70. logrus.Infof("数据库链接成功, 数据库名字: %s", name)
  71. }
  72. setupDB(db)
  73. return db
  74. }
  75. func setupDB(db *gorm.DB) {
  76. //db.LogMode(viper.GetBool("gormlog"))
  77. // 用于设置最大打开的连接数,默认值为0表示不限制.设置最大的连接数,可以避免并发太高导致连接mysql出现too many connections的错误。
  78. //db.DB().SetMaxOpenConns(20000)
  79. // 用于设置闲置的连接数.设置闲置的连接数则当开启的一个连接使用完成后可以放在池里等候下一次使用。
  80. //db.DB().SetMaxIdleConns(60)
  81. //db.SingularTable(true)@@
  82. sqlDB, err := db.DB()
  83. if err != nil {
  84. panic(err)
  85. }
  86. sqlDB.SetMaxIdleConns(100)
  87. }
  88. func InitDB() *gorm.DB {
  89. return openDB(
  90. viper.GetString("db.username"),
  91. viper.GetString("db.password"),
  92. viper.GetString("db.addr"),
  93. viper.GetString("db.name"),
  94. )
  95. }
  96. func getDB() *gorm.DB {
  97. if DB != nil {
  98. return DB.Self
  99. }
  100. return InitDB()
  101. }
  102. func GetDB() *gorm.DB {
  103. return DB.Self
  104. }