为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 pgx 记录查询?

如何使用 pgx 记录查询?

Go
慕丝7291255 2022-07-11 15:07:22
如果我使用 pgx 池,我找不到如何记录 sql 查询的文档。例如,我创建了这样的池:func DB() *pgxpool.Pool {    connStr := os.Getenv("DATABASE_URL")    conn, err := pgxpool.Connect(context.Background(), connStr)    if err != nil {        fmt.Fprintf(os.Stderr, "Unable to connect to database: %v\n", err)        os.Exit(1)    }    return conn}请告诉我如何记录我的查询?
查看完整描述

2 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

我最终得到了以下解决方案:


func DB() *pgxpool.Pool {

    config, err := pgxpool.ParseConfig(connStr)

    if err != nil {

        fmt.Fprintf(os.Stderr, "Unable to parse config: %v\n", err)

        os.Exit(1)

    }

    looger := &log.Logger{

        Out:          os.Stderr,

        Formatter:    new(log.JSONFormatter),

        Hooks:        make(log.LevelHooks),

        Level:        log.InfoLevel,

        ExitFunc:     os.Exit,

        ReportCaller: false,

    }

    config.ConnConfig.Logger = logrusadapter.NewLogger(looger)

    conn, err := pgxpool.ConnectConfig(context.Background(), config)

    if err != nil {

        fmt.Fprintf(os.Stderr, "Unable to connect to database: %v\n", err)

        os.Exit(1)

    }

    return conn

}


查看完整回答
反对 回复 2022-07-11
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

完全归功于@mystdeim,他在上面回答了。


抄袭原因:进口说明清楚


为什么不只是评论?:我没有 50 个代表


让我们开始


原答案:


func DB() *pgxpool.Pool {

config, err := pgxpool.ParseConfig(connStr)

if err != nil {

    fmt.Fprintf(os.Stderr, "Unable to parse config: %v\n", err)

    os.Exit(1)

}

looger := &log.Logger{

    Out:          os.Stderr,

    Formatter:    new(log.JSONFormatter),

    Hooks:        make(log.LevelHooks),

    Level:        log.InfoLevel,

    ExitFunc:     os.Exit,

    ReportCaller: false,

}

config.ConnConfig.Logger = logrusadapter.NewLogger(looger)

conn, err := pgxpool.ConnectConfig(context.Background(), config)

if err != nil {

    fmt.Fprintf(os.Stderr, "Unable to connect to database: %v\n", err)

    os.Exit(1)

}

return conn

}

上面的代码是可以的,但是我这里讲两点


进口:log

有一个令人困惑的导入log


让我们仔细看看


    looger := &log.Logger{

    Out:          os.Stderr,

    Formatter:    new(log.JSONFormatter),

    Hooks:        make(log.LevelHooks),

    Level:        log.InfoLevel,

    ExitFunc:     os.Exit,

    ReportCaller: false,

}

config.ConnConfig.Logger = logrusadapter.NewLogger(looger)

首先,我们来谈谈log包导入。假设从最后一行开始,他正在使用logrus


所以


import (

"log"

)

是不可能的,因为你会失去logrus那时的力量。


现在,如果您使用重命名logrus为log


import (

log "github.com/sirupsen/logrus"

)

它会产生另一个错误:


LstdFlags not declared by package logrus (UndeclaredImportedName)

进口logrusadapter

不再工作:


    import (

"github.com/jackc/pgx/log/logrusadapter"

)

正在工作:


        import (

"github.com/jackc/pgx/v4/log/logrusadapter"

)

[嗯,好像是2021年的v4,以后导入前一定要检查你的版本]


我修改后的解决方案

你不需要remame logrus,保持原样。


                import (

 "github.com/sirupsen/logrus"

 "github.com/jackc/pgx/v4/pgxpool"

"github.com/jackc/pgx/v4/log/logrusadapter"


)

最后


func DB() *pgxpool.Pool {

    config, err := pgxpool.ParseConfig(connStr)

    if err != nil {

        fmt.Fprintf(os.Stderr, "Unable to parse config: %v\n", err)

        os.Exit(1)

    }

    logrusLogger := &logrus.Logger{

    Out:          os.Stderr,

    Formatter:    new(logrus.JSONFormatter),

    Hooks:        make(logrus.LevelHooks),

    Level:        logrus.InfoLevel,

    ExitFunc:     os.Exit,

    ReportCaller: false,

   }

    config.ConnConfig.Logger = logrusadapter.NewLogger(logrusLogger)

    conn, err := pgxpool.ConnectConfig(context.Background(), config)

    if err != nil {

        fmt.Fprintf(os.Stderr, "Unable to connect to database: %v\n", err)

        os.Exit(1)

    }

    return conn

}


查看完整回答
反对 回复 2022-07-11
  • 2 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信