/models/init.go

https://github.com/cloudreve/Cloudreve · Go · 80 lines · 52 code · 13 blank · 15 comment · 8 complexity · 9c39318ab44a6179a942c62efb4ed25d MD5 · raw file

  1. package model
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/HFO4/cloudreve/pkg/conf"
  6. "github.com/HFO4/cloudreve/pkg/util"
  7. "github.com/gin-gonic/gin"
  8. "github.com/jinzhu/gorm"
  9. _ "github.com/jinzhu/gorm/dialects/mysql"
  10. _ "github.com/jinzhu/gorm/dialects/sqlite"
  11. )
  12. // DB 数据库链接单例
  13. var DB *gorm.DB
  14. // Init 初始化 MySQL 链接
  15. func Init() {
  16. util.Log().Info("初始化数据库连接")
  17. var (
  18. db *gorm.DB
  19. err error
  20. )
  21. if gin.Mode() == gin.TestMode {
  22. // 测试模式下,使用内存数据库
  23. db, err = gorm.Open("sqlite3", ":memory:")
  24. } else {
  25. switch conf.DatabaseConfig.Type {
  26. case "UNSET", "sqlite", "sqlite3":
  27. // 未指定数据库或者明确指定为 sqlite 时,使用 SQLite3 数据库
  28. db, err = gorm.Open("sqlite3", util.RelativePath(conf.DatabaseConfig.DBFile))
  29. case "mysql":
  30. // 当前只支持 sqlite3 与 mysql 数据库
  31. // TODO: import 其他 gorm 支持的主流数据库?否则直接 Open 没有任何意义。
  32. // TODO: 数据库连接其他参数允许用户自定义?譬如编码更换为 utf8mb4 以支持表情。
  33. db, err = gorm.Open("mysql", fmt.Sprintf("%s:%s@(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local",
  34. conf.DatabaseConfig.User,
  35. conf.DatabaseConfig.Password,
  36. conf.DatabaseConfig.Host,
  37. conf.DatabaseConfig.Port,
  38. conf.DatabaseConfig.Name))
  39. default:
  40. util.Log().Panic("不支持数据库类型: %s", conf.DatabaseConfig.Type)
  41. }
  42. }
  43. //db.SetLogger(util.Log())
  44. if err != nil {
  45. util.Log().Panic("连接数据库不成功, %s", err)
  46. }
  47. // 处理表前缀
  48. gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string {
  49. return conf.DatabaseConfig.TablePrefix + defaultTableName
  50. }
  51. // Debug模式下,输出所有 SQL 日志
  52. if conf.SystemConfig.Debug {
  53. db.LogMode(true)
  54. } else {
  55. db.LogMode(false)
  56. }
  57. //设置连接池
  58. //空闲
  59. db.DB().SetMaxIdleConns(50)
  60. //打开
  61. db.DB().SetMaxOpenConns(100)
  62. //超时
  63. db.DB().SetConnMaxLifetime(time.Second * 30)
  64. DB = db
  65. //执行迁移
  66. migration()
  67. }