首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用“where id in”从句与jackc/pgx?

如何使用“where id in”从句与jackc/pgx?
EN

Stack Overflow用户
提问于 2019-05-10 09:16:21
回答 2查看 6.2K关注 0票数 10

pgx是否为“哪里”条款提供支持?我在另一个堆栈溢出线程中发现,应该使用字符串连接手动构建查询。但IMO这是一个容易出错的问题,因为您必须自己处理转义/sql注入等问题。

我也试着自己解决这个问题:

代码语言:javascript
复制
const updatePurgedRecordingsStmt = "update recordings set status = 'DELETED', deleted = now() where status <> 'DELETED' and id in ($1);"

func (r *Repository) DeleteRecordings() error {
    pool, err := r.connPool()
    if err != nil {
        return errors.Wrap(err, "cannot establish connection")
    }
    pgRecIds := &pgtype.Int4Array{}

    if err := pgRecIds.Set([]int32{int32(1), int32(2)}); err != nil {
        return errors.Wrap(err, "id conversion failed")
    }
    if _, err = pool.Exec(updatePurgedRecordingsStmt, pgRecIds); err != nil {
        return errors.Wrap(err, "update stmt failed")
    }
    return nil
}

但是,当我执行这段代码时,会得到以下错误:

错误:绑定参数1中不正确的二进制数据格式(SQLSTATE 22P03)

我正在使用的版本:

Postgres:

代码语言:javascript
复制
db=> SELECT version();
                                              version
-----------------------------------------------------------------------------------------------------------
 PostgreSQL 9.6.11 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-16), 64-bit
(1 row)

PGX:

代码语言:javascript
复制
github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc=
github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
github.com/jackc/pgx v3.3.0+incompatible h1:Wa90/+qsITBAPkAZjiByeIGHFcj3Ztu+VzrrIpHjL90=
github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=
github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-10 13:07:07

正如您已经知道的,IN需要一个标量表达式列表,而不是一个数组,但是pgtype.Int4Array表示一个数组,而不是一个标量表达式列表。

"IMO,这有点容易出错,因为您必须自己处理转义/sql注入等问题。“

不一定,您可以遍历数组,构造参数引用字符串,将其连接到查询,然后使用...执行传入数组。

代码语言:javascript
复制
var paramrefs string
ids := []interface{}{1,2,3,4}
for i, _ := range ids {
    paramrefs += `$` + strconv.Itoa(i+1) + `,`
}
paramrefs = paramrefs[:len(paramrefs)-1] // remove last ","

query := `UPDATE ... WHERE id IN (` + paramrefs + `)`
pool.Exec(query, ids...)

或者,您可以使用ANY而不是IN

代码语言:javascript
复制
ids := &pgtype.Int4Array{}
ids.Set([]int{1,2,3,4})
query := `UPDATE ... WHERE id = ANY ($1)`
pool.Exec(query, ids)

(在这里,您可能不得不将param引用转换为适当的数组类型,我不确定,尝试一下没有强制转换,如果不确定,尝试使用cast )

票数 18
EN

Stack Overflow用户

发布于 2022-11-10 07:04:13

代码语言:javascript
复制
func prepareWhereINString(count int) string {
    var paramrefs string
    for i := 0; i < count; i++ {
        paramrefs += `$` + strconv.Itoa(i+1) + `,`
    }
    paramrefs = paramrefs[:len(paramrefs)-1] // remove last ","
    return paramrefs
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56074423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档