/backend/dao/dao.go

https://github.com/zendea/zendea · Go · 99 lines · 81 code · 14 blank · 4 comment · 20 complexity · c6258e14d22a79e1ec2759e73dc9507f MD5 · raw file

  1. package dao
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/gin-gonic/gin"
  6. "github.com/jinzhu/gorm"
  7. _ "github.com/jinzhu/gorm/dialects/mysql"
  8. _ "github.com/jinzhu/gorm/dialects/sqlite"
  9. "github.com/spf13/viper"
  10. "zendea/model"
  11. "zendea/util/log"
  12. )
  13. var (
  14. db *gorm.DB
  15. )
  16. const DRIVER_MYSQL = "mysql"
  17. const DRIVER_SQLITE = "sqlite"
  18. // Setup : Connect to mysql database
  19. func Setup() {
  20. var err error
  21. switch viper.Get("database.driver") {
  22. case DRIVER_SQLITE:
  23. path := viper.GetString("database.sqlite.path")
  24. db, err = gorm.Open("sqlite3", path)
  25. if err != nil {
  26. log.Fatal(fmt.Sprintf("Failed to connect sqlite %s", err.Error()))
  27. } else {
  28. log.Info("Successfully connect to sqlite3, path: %s.", path)
  29. db.LogMode(true)
  30. }
  31. case DRIVER_MYSQL:
  32. host := viper.GetString("database.mysql.host")
  33. user := viper.GetString("database.mysql.user")
  34. password := viper.GetString("database.mysql.password")
  35. name := viper.GetString("database.mysql.name")
  36. charset := viper.GetString("database.mysql.charset")
  37. dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=%s&parseTime=True&loc=Local", user, password, host, name, charset)
  38. db, err = gorm.Open("mysql", dsn)
  39. if err != nil {
  40. log.Fatal(fmt.Sprintf("Failed to connect mysql %s", err.Error()))
  41. } else {
  42. log.Info("Successfully connect to MySQL, database: %s.", name)
  43. db.DB().SetMaxIdleConns(viper.GetInt("database.mysql.pool.min"))
  44. db.DB().SetMaxOpenConns(viper.GetInt("database.mysql.pool.max"))
  45. db.DB().SetConnMaxLifetime(time.Minute)
  46. if gin.Mode() != gin.ReleaseMode {
  47. db.LogMode(true)
  48. }
  49. }
  50. default:
  51. log.Fatal("We do not support this kind of storage system yet!")
  52. }
  53. db.SingularTable(true) //禁用表名复数
  54. if err = db.AutoMigrate(model.Models...).Error; nil != err {
  55. log.Error("auto migrate tables failed")
  56. }
  57. }
  58. // Shutdown - close database connection
  59. func Shutdown() error {
  60. log.Info("Closing database's connections")
  61. return db.Close()
  62. }
  63. // GetDb - get a database connection
  64. func DB() *gorm.DB {
  65. return db
  66. }
  67. // 事务环绕
  68. func Tx(txFunc func(tx *gorm.DB) error) (err error) {
  69. tx := db.Begin()
  70. if tx.Error != nil {
  71. return
  72. }
  73. defer func() {
  74. if r := recover(); r != nil {
  75. tx.Rollback()
  76. panic(r) // re-throw panic after Rollback
  77. } else if err != nil {
  78. tx.Rollback()
  79. } else {
  80. err = tx.Commit().Error
  81. }
  82. }()
  83. err = txFunc(tx)
  84. return err
  85. }