如何使用 pgx 记录查询?

mys*_*eim 7 go pgx

如果我使用 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)

请告诉我如何记录我的查询?

mys*_*eim 7

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

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)


Flo*_*ent 5

您可能还希望对记录的查询进行适当的控制,为此您可以使用跟踪器:

在这里,我使用 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)