postgresql - pgxpreparedStatement 执行不返回结果(与 fmt.Sprintf 不同)
问题描述
出于某种原因,我使用 pgx 在 go 中构建的 prepareStatement 没有返回任何结果/行(参见场景 1)。在场景 2 中,如果我使用 Sprintf 和 $ 构建相同的查询,也不会返回结果。
但是,如场景 3 所示,如果我使用带有 %s 占位符的 Sprintf 构建查询并执行它,它将返回结果/行。
我想使用场景 1 的“逻辑”构建/执行查询(使用准备好的语句而不是使用 Sprintf)。有任何想法吗?
我直接在数据库上测试了查询(使用 pgadmin),它有数据/结果。
假设: 我怀疑它可能与以下内容有关:
- 在 WHERE 条件下:uuid 数据类型或在 IN 条件下带有字符串
- 返回一个uuid和一个jsonb的查询结果
详细信息: 数据库是 postgres,表 t 具有以下字段类型:
- t.str1 和 t.properties 是字符串
- t.my_uuid 是 uuid.UUID ( https://github.com/satori/go.uuid )
- tC 是 jsonb
- 我正在使用的 pgx 版本是:github.com/jackc/pgx v3.6.2+incompatible
情景 1
func prepareQuery(cp *pgx.ConnPool) (string, error) {
prep := `SELECT DISTINCT
A,B,C
FROM table t
WHERE t.str1 = $1
AND t.properties IN ($2)
AND t.my_uuid = $3`
_, err := cp.Prepare("queryPrep", prep)
if err != nil {
return "some error", err
}
return prep, nil
}
func x() {
//...
q, err := prepareQuery(cPool)
if err != nil {
return fmt.Errorf("failed to prepare query %s: %w", q, err)
}
rows, err := cPool.Query("queryPrep", "DumyStr", "'prop1','prop2'", myUUID) //myUUID is a valid satori uuid
if err != nil {
//return error...
}
for rows.Next() { // zero rows
//Scan...
}
//...
}
情景 2
func makeQueryStr()string {
return fmt.Sprintf(`SELECT DISTINCT
A,B,C
FROM table t
WHERE t.str1 = $1
AND t.properties IN ($2)
AND t.my_uuid = $3`)
}
func x() {
//...
myQuery := makeQueryStr()
rows, err := cPool.Query(myQuery, "DumyStr", "'prop1','prop2'", myUUID) //myUUID is a valid satori uuid
if err != nil {
//return error...
}
for rows.Next() { // zero rows
//Scan...
}
//...
}
情景 3
func makeQueryStr(par1 string, par2 string, par3 uuid.UUID)string {
return fmt.Sprintf(`SELECT DISTINCT
A,B,C
FROM table t
WHERE t.str1 = '%s'
AND t.properties IN (%s)
AND t.my_uuid = '%s'`, par1, par2, par3)
}
func x() {
//...
myQuery := makeQueryStr("DumyStr", "'prop1','prop2'", myUUID) //myUUID is a valid satori uuid
rows, err := cPool.Query(myQuery)
if err != nil {
//return error...
}
for rows.Next() { // 10 rows
//Scan...
}
//...
}
解决方案
推荐阅读
- django - 如果我在集群上使用 Ingress-Nginx 服务,是否需要在 Kubernetes 集群中使用 nginx 容器来提供静态文件?
- wordpress - 当您复制一个部分并隐藏一个用于移动设备和一个用于桌面时,使锚点起作用
- python - 如何删除列表中的前 50 个项目而不复制它?
- javascript - 尝试使用增益节点增加视频音量,而是静音
- php - 为用户身份验证生成“令牌”的最佳方法是什么
- vue.js - 是否可以将 vite 与 Nuxt.js 一起使用以快速重新加载?
- javascript - 将 puppeteer 视口设置为 null 不会更改视口
- python - 尝试将列表中的所有项目打印到行和列
- r - 从cutree组R的祖先节点获取树
- pandas - 更改 seaborn 直方图(或 plt)中数据选择的条形颜色