首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用pgx记录查询?

如何使用pgx记录查询?
EN

Stack Overflow用户
提问于 2020-10-24 01:40:43
回答 3查看 1.8K关注 0票数 2

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

代码语言:javascript
复制
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
}

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

EN

回答 3

Stack Overflow用户

发布于 2020-10-25 23:42:39

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

代码语言:javascript
复制
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
}
票数 4
EN

Stack Overflow用户

发布于 2020-10-24 02:29:29

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

代码语言:javascript
复制
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)
}
conn.Config().Logger = myLogger

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

然后在你的记录器中,只需要用"sql“键来记录:

代码语言:javascript
复制
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)
    }
}
票数 3
EN

Stack Overflow用户

发布于 2021-09-17 04:58:37

完全归功于@mystdeim,他回答了上面的问题。

复制原因:清晰的导入说明

为什么不直接评论呢?:我没有50个代表

我们开始吧

原始答案:

代码语言:javascript
复制
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
}

上面的代码是可以的,但我将在这里讨论两点

  1. Import: log

有一个令人困惑的log导入

让我们仔细看看

代码语言:javascript
复制
    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

所以

代码语言:javascript
复制
import (
"log"
)

是不可能的,因为你将失去logrus的力量。

现在,如果使用以下命令将logrus重命名为log

代码语言:javascript
复制
import (
log "github.com/sirupsen/logrus"
)

它将生成另一个错误:

代码语言:javascript
复制
LstdFlags not declared by package logrus (UndeclaredImportedName)

  1. Import logrusadapter

不再有效:

代码语言:javascript
复制
    import (
"github.com/jackc/pgx/log/logrusadapter"
)

目前正在运行:

代码语言:javascript
复制
        import (
"github.com/jackc/pgx/v4/log/logrusadapter"
)

好的,它似乎是在2021年的v4中,请确保在未来导入之前检查您的版本

  1. My修改的solution

你不需要重命名logrus,保持它的原样。

代码语言:javascript
复制
                import (
 "github.com/sirupsen/logrus"
 "github.com/jackc/pgx/v4/pgxpool"
"github.com/jackc/pgx/v4/log/logrusadapter"

)

最后

代码语言:javascript
复制
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
}

非常感谢@mystdeim帮助我找到了一个好的日志系统

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64504879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档