sni*_*nko 7 postgresql prepared-statement go pgbouncer
我正在尝试使用Go 中的pq 驱动程序连接到 postresql 数据库。当我在数据库的本地副本上执行此操作时,使用类似的连接字符串
DB, err = sql.Open("postgres", "user=user password=pwd dbname=mydb sslmode=disable")
Run Code Online (Sandbox Code Playgroud)
这一切都很好。
但是,当我切换到连接通过 pgbouncer 的生产服务器时:
DB, err = sql.Open("postgres", "user=user password=pwd host=/var/run/pgbouncer port=port dbname=mydb sslmode=disable")
Run Code Online (Sandbox Code Playgroud)
对于所有查询,我一直收到相同的错误,无论多么简单:
Database error: pq: S:"ERROR" M:"prepared statement \"1\" does not exist" C:"26000" F:"prepare.c" L:"519" R:"FetchPreparedStatement"
Run Code Online (Sandbox Code Playgroud)
(它总是“准备好的语句\”1\“”,独立于我试图通过的查询)
两种情况下的查询都运行如下:
res_rows, err := DB.Query(query)
if err != nil {
log.Printf("Database error: %s\n", err)
}
for res_rows.Next() {
...
}
Run Code Online (Sandbox Code Playgroud)
谷歌搜索建议关闭准备好的语句,但我不知道如何在 Go 中做到这一点,我不确定它是否受支持。任何帮助(甚至建议完全使用其他东西)将不胜感激。
如果您使用 PgBouncer,则需要将binary_parameters=yes
数据库 dsn 连接设置为查询参数
尝试这个:
DB, err = sql.Open("postgres", "user=user password=pwd dbname=mydb sslmode=disable, binary_parameters=yes")
Run Code Online (Sandbox Code Playgroud)type Queryer interface { Query(query string, args []Value) (Rows, error) }
Queryer
是一个可选接口,可以由Conn
.如果 a
Conn
未实现Queryer
,则sql
包DB.Query
将首先准备查询,执行语句,然后关闭语句。
我没有看到lib/pq PostgreSQL 驱动程序在哪里实现Queryer
。因此,DB.Query
查询是在执行之前准备好的。
PgBouncer不支持所有池化方法的 PREPARE 功能:池化模式的特征矩阵。
归档时间: |
|
查看次数: |
7210 次 |
最近记录: |