【问题标题】:pass array to go-pg query将数组传递给 go-pg 查询
【发布时间】:2018-07-03 13:49:36
【问题描述】:

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

【问题讨论】:

  • 遍历数组并转换为带分隔符的字符串,
  • @Himanshu 这样如果我得到你正确我会得到id IN ('7,45') 这不是我需要的
  • 使用pg.Array?

标签: go go-pg


【解决方案1】:

你可以做几件事:

  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))

【讨论】:

    【解决方案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)
    

    【讨论】:

      【解决方案3】:

      一种方法是创建一个带有分隔符的字符串以创建一个字符串,然后将其传递给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 (?);
      

      当 this 被准备为后端的语句时, bindvar ? 只会对应一个参数,但通常是需要的 是因为它是可变数量的参数,具体取决于 一些切片的长度,例如:

      var levels = []int{4, 6, 7}
      rows, err := db.Query("SELECT * FROM users WHERE level IN (?);", levels)
      

      【讨论】:

      • 当我这样做时,我得到以下生成的查询:SELECT id FROM bar WHERE code_id IN ('7,45')
      • @XZen 不,当您使用它创建查询时,您不会。请检查生成的查询的更新答案。
      • 减少内存分配的相同功能:play.golang.org/p/JuXR-P8prEd
      • @Himanshu,知道了,但我的目标是使用 go-pg 和它的占位符功能,这样我就可以避免字符串操作,这不是构建查询的最安全方法。如果没有办法使用 go-pg 做到这一点,那会很伤心,我会像你刚刚提供的那样走,谢谢。
      • @XZen 您仍然可以添加字符串并将其传递给您正在动态创建它的 sql 查询
      猜你喜欢
      • 1970-01-01
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 2021-03-30
      • 1970-01-01
      相关资源
      最近更新 更多