5

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

3 回答 3

8

您可以做几件事:

  1. 继续使用in (...)和使用pg.In
  2. = any(array)在您的 SQL 中使用,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))
于 2018-07-03T20:12:23.903 回答
2

您可以使用 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)
于 2020-01-04T21:55:48.520 回答
-1

一种方法是创建一个带有分隔符的字符串来创建一个字符串,然后将其传递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/sqlpackage 不会检查您的查询,它会将您的参数直接传递给驱动程序,这使得处理带有 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)
于 2018-07-03T14:01:04.573 回答