簡體   English   中英

將數組傳遞給 go-pg 查詢

[英]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)

您可以做以下幾件事:

  1. 繼續使用in (...)並使用pg.In
  2. 在你的 SQL 中使用= 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM