Как вы уже знаете, IN
ожидает список скалярных выражений , а не массив, однако pgtype.Int4Array
представляет массив , а не список скалярных выражений.
"IMO, это немного подвержено ошибкам, так как вы должны самостоятельно позаботиться о экранировании / sql-инъекции и т. П."
Не обязательно, вы можете циклически проходить по вашему массиву, создавать строку ссылок на параметры, объединять это с запросом и затем выполнять, передавая в массиве ...
.
var paramrefs string
ids := []int{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)
(здесь вам, возможно, придется привести ссылку на параметр к соответствующему типу массива, я не уверен, попробуйте без преобразования, если не в порядке, попробуйте с приведением)