为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 jackc/pgx 中使用“where id in”子句?

如何在 jackc/pgx 中使用“where id in”子句?

Go
白衣非少年 2023-06-19 13:51:34
pgx 是否为“where in”子句提供任何支持?我在另一个 stackoverflow 线程中发现应该使用字符串连接来手动构建查询。IMO 这有点容易出错,因为你必须自己处理转义/sql 注入等。我也试着自己弄明白: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)我使用的版本:邮政系统: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: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=
查看完整描述

2 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

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

}


查看完整回答
反对 回复 2023-06-19
?
忽然笑

TA贡献1806条经验 获得超5个赞

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


“IMO 虽然这有点容易出错,因为你必须自己处理转义/sql 注入等。”


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


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。


ids := &pgtype.Int4Array{}

ids.Set([]int{1,2,3,4})

query := `UPDATE ... WHERE id = ANY ($1)`

pool.Exec(query, ids)

(这里你可能必须将参数引用转换为适当的数组类型,我不确定,试试不转换,如果不行,尝试转换)


查看完整回答
反对 回复 2023-06-19
  • 2 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信