/shared/database/database.go

https://github.com/xmlking/micro-starter-kit · Go · 66 lines · 53 code · 12 blank · 1 comment · 9 complexity · 943d9c6e4f9206067a5b7b62585b5192 MD5 · raw file

  1. package database
  2. import (
  3. "fmt"
  4. "strings"
  5. "github.com/jinzhu/gorm"
  6. "github.com/rs/zerolog/log"
  7. "github.com/xmlking/micro-starter-kit/shared/logger/gormlog"
  8. configPB "github.com/xmlking/micro-starter-kit/shared/proto/config"
  9. )
  10. // GetDatabaseConnection return (gorm.DB or error)
  11. func GetDatabaseConnection(dbConf configPB.DatabaseConfiguration) (db *gorm.DB, err error) {
  12. var timezoneCommand string
  13. switch dbConf.Dialect {
  14. case configPB.DatabaseDialect_SQLite3:
  15. db, err = connection(dbConf)
  16. case configPB.DatabaseDialect_Postgre:
  17. timezoneCommand = "SET timezone = 'UTC'"
  18. db, err = connection(dbConf)
  19. case configPB.DatabaseDialect_MySQL:
  20. timezoneCommand = "SET time_zone = '+00:00'"
  21. db, err = connection(dbConf)
  22. default:
  23. return nil, fmt.Errorf("database dialect %s not supported", dbConf.Dialect)
  24. }
  25. if err != nil {
  26. return
  27. }
  28. gLogger := log.With().
  29. Str("module", "gorm").
  30. Logger()
  31. db.SetLogger(gormlog.NewGormLogger(gLogger))
  32. if dbConf.Logging {
  33. db.Debug()
  34. }
  35. db.LogMode(dbConf.Logging)
  36. db.SingularTable(dbConf.Singularize)
  37. db.DB().SetMaxOpenConns(int(dbConf.MaxOpenConns))
  38. db.DB().SetMaxIdleConns(int(dbConf.MaxIdleConns))
  39. db.DB().SetConnMaxLifetime(*dbConf.ConnMaxLifetime)
  40. if dbConf.Utc {
  41. if _, err = db.DB().Exec(timezoneCommand); err != nil {
  42. return nil, fmt.Errorf("error setting UTC timezone: %w", err)
  43. }
  44. }
  45. return
  46. }
  47. func connection(dbConf configPB.DatabaseConfiguration) (db *gorm.DB, err error) {
  48. url, err := dbConf.URL()
  49. if err != nil {
  50. return nil, err
  51. }
  52. db, err = gorm.Open(strings.ToLower(string(dbConf.Dialect.String())), url)
  53. return
  54. }