[英]pass array to go-pg query
我正在使用 Go-pg,當我使用以下方式執行 sql 查詢時:
db.Query(&result, sqlQuery, params)
其中params
是如下結構:
type MyParams struct {
Codes []int
}
和sqlQuery
是
SELECT id FROM bar WHERE code_id IN (?codes)
在實際的 SQL 查詢中,我得到這樣的查詢:
SELECT id FROM bar WHERE code_id IN ('[7,45]')
是否可以正確傳遞 int 數組占位符以進行查詢:
SELECT id FROM bar WHERE code_id IN (7,45)
您可以做以下幾件事:
in (...)
並使用pg.In
。= any(array)
而不是in (list)
和pg.Array
在 Go 中發送一個正確的數組到 PostgreSQL。第一個看起來像:
db.Query(&result, `SELECT id FROM bar WHERE code_id IN (?)`, pg.In(params.Codes))
第二個看起來像:
db.Query(&result, `SELECT id FROM bar WHERE code_id = ANY (?)`, pg.Array(params.Codes))
您可以改用 go-pg ORM 來獲得相同的結果:
ids := []int{1, 2, 3}
err := db.Model((*Book)(nil)).
Where("id in (?)", pg.In(ids)).
Select()
// SELECT * FROM books WHERE id IN (1, 2, 3)
您可以嘗試執行以下操作:
// Slice with your integer IDs as strings.
ids := []string{}
// Convert integer ID to string ID.
for _, i := range []int{7, 45} {
ids = append(ids, strconv.Itoa(i))
}
現在,您可以使用Join
函數,並且最終查詢看起來非常簡單,如下所示:
in := strings.Join(ids, ",")
query := "SELECT id FROM bar WHERE code_id IN (" + in + ")"
一種方法是創建一個帶有分隔符的字符串以生成字符串,然后將其傳遞給db.query
以獲取結果。
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
a := []int{7,45,32}
str := ConvertToString(a, ",")
query := `Select * from table1 where ID IN(`+ str +`)`
fmt.Println(query)
}
func ConvertToString(a []int, delim string) string{
var b string
for _, v := range a{
b += strconv.Itoa(v)
b += ","
}
return strings.Trim(b,",")
}
Playground上的工作代碼。
編輯:-
您可以根據需要使用Golang sqlx包。
database/sql
包不會檢查您的查詢,而是將您的參數直接傳遞給驅動程序,這使得處理帶有 IN 子句的查詢變得困難:
SELECT * FROM users WHERE level IN (?);
當它准備好作為后端的語句時, bindvar ? 將只對應一個參數,但通常需要的是根據某個切片的長度,它是可變數量的參數,例如:
var levels = []int{4, 6, 7}
rows, err := db.Query("SELECT * FROM users WHERE level IN (?);", levels)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.