init.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package postgres
  2. import (
  3. "context"
  4. e "errors"
  5. "fmt"
  6. "gframe/errors"
  7. "gframe/global"
  8. "github.com/jackc/pgconn"
  9. "github.com/jackc/pgx/v4"
  10. "github.com/jackc/pgx/v4/pgxpool"
  11. "github.com/sirupsen/logrus"
  12. )
  13. var writeDB *pgxpool.Pool
  14. func Init() {
  15. logrus.Info("初始化数据库")
  16. dbCfg, err := global.Config.GetPostgreSQL()
  17. if err != nil {
  18. panic(err)
  19. }
  20. writeCfg := dbCfg.Write
  21. connStr := fmt.Sprintf("host=%s port=%d user=%s dbname=%s password=%s sslmode=disable TimeZone=Asia/Shanghai",
  22. writeCfg.Host, writeCfg.Port, writeCfg.User, global.Project.DBName, writeCfg.Password)
  23. writeDB, err = pgxpool.Connect(context.Background(), connStr)
  24. if err != nil {
  25. logrus.Panicf("连接数据库失败:%v\n", err)
  26. panic(err)
  27. }
  28. }
  29. type base struct {
  30. c context.Context
  31. }
  32. func (b base) ctx() context.Context {
  33. if b.c == nil {
  34. b.c = context.Background()
  35. }
  36. return b.c
  37. }
  38. func (b base) writeDB() *pgxpool.Pool {
  39. return writeDB
  40. }
  41. func panicError(err error) {
  42. if err != nil {
  43. err = errors.NewFromError(err, errors.CodeDATABASE)
  44. panic(err)
  45. }
  46. }
  47. func panicExec(tag pgconn.CommandTag, err error) {
  48. if err != nil {
  49. if e.Is(err, pgx.ErrNoRows) {
  50. err = errors.NewFromError(err, errors.CodeNoRecord)
  51. } else {
  52. err = errors.NewFromError(err, errors.CodeDATABASE)
  53. }
  54. panic(err)
  55. }
  56. }
  57. func isRecordNotFound(err error) bool {
  58. if e.Is(err, pgx.ErrNoRows) {
  59. return true
  60. } else {
  61. panicError(err)
  62. return false
  63. }
  64. }
  65. //todo 请周睿检查一下这个方法
  66. func PgSqlRowsToInerface(rows pgx.Rows) (tableData []interface{}) {
  67. fieldDescriptions := rows.FieldDescriptions()
  68. var columns []string
  69. for _, col := range fieldDescriptions {
  70. columns = append(columns, string(col.Name))
  71. }
  72. count := len(columns)
  73. //tableData := make([]map[string]interface{}, 0)
  74. values := make([]interface{}, count)
  75. valuePtrs := make([]interface{}, count)
  76. for rows.Next() {
  77. for i := 0; i < count; i++ {
  78. valuePtrs[i] = &values[i]
  79. }
  80. rows.Scan(valuePtrs...)
  81. entry := make(map[string]interface{})
  82. for i, col := range columns {
  83. var v interface{}
  84. val := values[i]
  85. b, ok := val.([]byte)
  86. if ok {
  87. v = string(b)
  88. } else {
  89. v = val
  90. }
  91. entry[col] = v
  92. }
  93. tableData = append(tableData, entry)
  94. }
  95. return
  96. }