Go 和 pgx:无法将 [+11111111111] 转换为文本

Go and pgx: cannot convert [+11111111111] to Text

我是 golang 和 pgx 的新手,当我尝试 运行 一个简单的查询时,我 运行 遇到了一个问题。我在 postgres 中有以下 table。

CREATE TABLE users (
    user_id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
    phone_number TEXT NOT NULL UNIQUE, 
);

当我尝试 运行 以下查询时:

func sampleFunc(db dbClient){
    number := "+111111111"
    rows, err := db.Query(context.Background(), "SELECT user_id FROM users WHERE phone_number=::TEXT;", number)
    if err != nil {
        log.Println(err)
        return false, err
    }
}

我收到以下错误:无法将 [+111111111] 转换为文本。

编辑 03/05/2022

我应该注意,我将 pgxpool.Pool 包装在我自己的结构中,出于某种原因,当我直接使用 pgxpool 时实际上没有问题。

type dbClient interface {
    Query(ctx context.Context, query string, args ...interface{}) (pgx.Rows, error)
}

type SQLClient struct {
    Conn *pgxpool.Pool
}

func (db *SQLClient) Query(ctx context.Context, query string, args ...interface{}) (pgx.Rows, error) {
    return db.Conn.Query(ctx, query, args)
}

我假设类型信息出现问题,但仍然不知道如何修复它。

当我在 SQLClient.Query 中打印 args 类型信息时,通过使用 fmt.Println(reflect.TypeOf(args)),我得到以下信息: []interface {}

I saw the same problem here

I think this is caused by the combination of pgx internally using prepared statements and PostgreSQL not being able to determine the type of the placeholders. The simplest solution is to include type information with your placeholders. e.g. ::int. Alternatively, you could configure pgx to use the simple protocol instead of prepared statements.

您忘记将 ... 添加到传递给 db.Conn.Query()args 参数中。

func (db *SQLClient) Query(ctx context.Context, query string, args ...interface{}) (pgx.Rows, error) {
    return db.Conn.Query(ctx, query, args...)
}

The spec.