如何使用pgx记录查询?

问题描述

如果使用pgx池,我找不到如何记录SQL查询的文档。例如,我创建了这样的池:

irb(main):001:0> hash = {"pot" => 1,"tot" => 2,"not" => 3}
=> {"pot"=>1,"tot"=>2,"not"=>3}
irb(main):002:0> key = "not"
=> "not"
irb(main):003:0> hash.keys.include?(key)
=> true

请告诉我然后如何记录查询

解决方法

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

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
}
,

只需在连接的ConnConfig属性中设置记录器:

conn,err := pgxpool.Connect(context.Background(),connStr)
if err != nil {
    fmt.Fprintf(os.Stderr,err)
    os.Exit(1)
}
conn.Config().Logger = myLogger

根据您使用的记录器,有很多适配器(例如https://github.com/jackc/pgx/blob/master/log/zapadapter/adapter.go

然后在记录器中,只需使用“ sql”键记录事物:

func (m *myLogger) Log(ctx context.Context,level pgx.LogLevel,msg string,data map[string]interface{}) {
    if sql,ok := data["sql"]; ok {
        m.Log("Executing SQL: %s",sql)
    }
}