问题描述
如果使用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)
}
}