| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- package postgres
- import (
- "context"
- e "errors"
- "fmt"
- "gframe/errors"
- "gframe/global"
- "github.com/jackc/pgconn"
- "github.com/jackc/pgx/v4"
- "github.com/jackc/pgx/v4/pgxpool"
- "github.com/sirupsen/logrus"
- )
- var writeDB *pgxpool.Pool
- func Init() {
- logrus.Info("初始化数据库")
- dbCfg, err := global.Config.GetPostgreSQL()
- if err != nil {
- panic(err)
- }
- writeCfg := dbCfg.Write
- connStr := fmt.Sprintf("host=%s port=%d user=%s dbname=%s password=%s sslmode=disable TimeZone=Asia/Shanghai",
- writeCfg.Host, writeCfg.Port, writeCfg.User, global.Project.DBName, writeCfg.Password)
- writeDB, err = pgxpool.Connect(context.Background(), connStr)
- if err != nil {
- logrus.Panicf("连接数据库失败:%v\n", err)
- panic(err)
- }
- }
- type base struct {
- c context.Context
- }
- func (b base) ctx() context.Context {
- if b.c == nil {
- b.c = context.Background()
- }
- return b.c
- }
- func (b base) writeDB() *pgxpool.Pool {
- return writeDB
- }
- func panicError(err error) {
- if err != nil {
- err = errors.NewFromError(err, errors.CodeDATABASE)
- panic(err)
- }
- }
- func panicExec(tag pgconn.CommandTag, err error) {
- if err != nil {
- if e.Is(err, pgx.ErrNoRows) {
- err = errors.NewFromError(err, errors.CodeNoRecord)
- } else {
- err = errors.NewFromError(err, errors.CodeDATABASE)
- }
- panic(err)
- }
- }
- func isRecordNotFound(err error) bool {
- if e.Is(err, pgx.ErrNoRows) {
- return true
- } else {
- panicError(err)
- return false
- }
- }
- //todo 请周睿检查一下这个方法
- func PgSqlRowsToInerface(rows pgx.Rows) (tableData []interface{}) {
- fieldDescriptions := rows.FieldDescriptions()
- var columns []string
- for _, col := range fieldDescriptions {
- columns = append(columns, string(col.Name))
- }
- count := len(columns)
- //tableData := make([]map[string]interface{}, 0)
- values := make([]interface{}, count)
- valuePtrs := make([]interface{}, count)
- for rows.Next() {
- for i := 0; i < count; i++ {
- valuePtrs[i] = &values[i]
- }
- rows.Scan(valuePtrs...)
- entry := make(map[string]interface{})
- for i, col := range columns {
- var v interface{}
- val := values[i]
- b, ok := val.([]byte)
- if ok {
- v = string(b)
- } else {
- v = val
- }
- entry[col] = v
- }
- tableData = append(tableData, entry)
- }
- return
- }
|