/ext/db/sqlx/service.go

https://github.com/henrylee2cn/faygo · Go · 86 lines · 67 code · 14 blank · 5 comment · 19 complexity · c3ca1782722ad4a910e83de255ae6fc9 MD5 · raw file

  1. package sqlx
  2. import (
  3. "os"
  4. "path/filepath"
  5. "strings"
  6. "github.com/jmoiron/sqlx"
  7. "github.com/jmoiron/sqlx/reflectx"
  8. // _ "github.com/denisenkom/go-mssqldb" //mssql
  9. _ "github.com/go-sql-driver/mysql" //mysql
  10. _ "github.com/lib/pq" //postgres
  11. // _ "github.com/mattn/go-oci8" //oracle(need to install the pkg-config utility)
  12. // _ "github.com/mattn/go-sqlite3" //sqlite
  13. "github.com/henrylee2cn/faygo"
  14. )
  15. // DBService is a database engine object.
  16. type DBService struct {
  17. Default *sqlx.DB // the default database engine
  18. List map[string]*sqlx.DB // database engine list
  19. }
  20. var dbService = func() (serv *DBService) {
  21. serv = &DBService{
  22. List: map[string]*sqlx.DB{},
  23. }
  24. var errs []string
  25. defer func() {
  26. if len(errs) > 0 {
  27. panic("[sqlx] " + strings.Join(errs, "\n"))
  28. }
  29. if serv.Default == nil {
  30. faygo.Panicf("[sqlx] the `default` database engine must be configured and enabled")
  31. }
  32. }()
  33. err := loadDBConfig()
  34. if err != nil {
  35. faygo.Panicf("[sqlx]", err.Error())
  36. return
  37. }
  38. for _, conf := range dbConfigs {
  39. if !conf.Enable {
  40. continue
  41. }
  42. db, err := sqlx.Connect(conf.Driver, conf.Connstring)
  43. if err != nil {
  44. faygo.Critical("[sqlx]", err.Error())
  45. errs = append(errs, err.Error())
  46. continue
  47. }
  48. db.SetMaxOpenConns(conf.MaxOpenConns)
  49. db.SetMaxIdleConns(conf.MaxIdleConns)
  50. var strFunc = strings.ToLower
  51. if conf.ColumnSnake {
  52. strFunc = faygo.SnakeString
  53. }
  54. // Create a new mapper which will use the struct field tag "json" instead of "db"
  55. db.Mapper = reflectx.NewMapperFunc(conf.StructTag, strFunc)
  56. if conf.Driver == "sqlite3" && !faygo.FileExists(conf.Connstring) {
  57. os.MkdirAll(filepath.Dir(conf.Connstring), 0777)
  58. f, err := os.Create(conf.Connstring)
  59. if err != nil {
  60. faygo.Critical("[sqlx]", err.Error())
  61. errs = append(errs, err.Error())
  62. } else {
  63. f.Close()
  64. }
  65. }
  66. serv.List[conf.Name] = db
  67. if DEFAULTDB_NAME == conf.Name {
  68. serv.Default = db
  69. }
  70. }
  71. return
  72. }()