如果我使用 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
}
Run Code Online (Sandbox Code Playgroud)
请告诉我如何记录我的查询?
我最终得到了以下解决方案:
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
}
Run Code Online (Sandbox Code Playgroud)
您可能还希望对记录的查询进行适当的控制,为此您可以使用跟踪器:
在这里,我使用 zap.SugaredLogger 作为记录器,但它可以是其他任何东西。
type myQueryTracer struct {
log *zap.SugaredLogger
}
func (tracer *myQueryTracer) TraceQueryStart(
ctx context.Context,
_ *pgx.Conn,
data pgx.TraceQueryStartData) context.Context {
tracer.log.Infow("Executing command", "sql", data.SQL, "args", data.Args)
return ctx
}
func (tracer *myQueryTracer) TraceQueryEnd(ctx context.Context, conn *pgx.Conn, data pgx.TraceQueryEndData) {
}
func DB() *pgxpool.Pool {
connStr := os.Getenv("DATABASE_URL")
dbConfig, err := pgx.ParseConfig(connStr)
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to parse connString: %v\n", err)
os.Exit(1)
}
dbConfig.Tracer = &myQueryTracer{
log: log,
}
conn, err := pgx.ConnectConfig(
context.Background(),
dbConfig,
)
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to connect to database: %v\n", err)
os.Exit(1)
}
return conn
}
Run Code Online (Sandbox Code Playgroud)