亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 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 關注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號