我刚接触过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)
}我假设类型信息发生了变化,但仍然无法解决如何修复它。
当我在SQLClient.Query中打印SQLClient.Query类型信息时,通过使用fmt.Println(reflect.TypeOf(args)),我得到以下信息:[]interface {}
发布于 2022-03-06 09:19:39
您忘记将...添加到传递给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...)
}规格。
发布于 2022-03-05 05:30:40
我认为这是由于pgx内部使用准备语句和PostgreSQL无法确定占位符的类型而造成的。最简单的解决方案是在占位符中包含类型信息。例如$1::int。或者,您可以将pgx配置为使用简单协议而不是准备好的语句。
https://stackoverflow.com/questions/71358226
复制相似问题