将数组传递给go-pg查询

时间:2018-07-03 13:49:36

标签: go go-pg

我正在使用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)

4 个答案:

答案 0 :(得分:2)

您可以做几件事:

  1. 继续使用in (...)并使用pg.In
  2. 在SQL中使用= any(array),而不是Go中的in (list)pg.Array,以将适当的数组发送到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))

答案 1 :(得分:1)

您可以使用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)

答案 2 :(得分:0)

一种方法是使用创建字符串所需的定界符创建一个字符串,然后将其传递到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)

答案 3 :(得分:0)

您可以尝试执行以下操作:

// 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 + ")"