0

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

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=$1::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)
}

我假设然后类型信息发生了一些事情,但仍然无法弄清楚如何修复它。

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

4

1 回答 1

0

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. $1::int. Alternatively, you could configure pgx to use the simple protocol instead of prepared statements.

于 2022-03-05T05:30:40.023 回答