IN pq.Array无法传递值

时间:2017-04-14 07:57:27

标签: postgresql go

我有以下代码:

package main

import (
    "database/sql"
    "fmt"
    "github.com/lib/pq"
)

const (
    DB_USER     = "<username>"
    DB_PASSWORD = "<password>"
    DB_NAME     = "<db>"
)

func main() {
    dbinfo := fmt.Sprintf("user=%s password=%s dbname=%s sslmode=disable",
    DB_USER, DB_PASSWORD, DB_NAME)

    db, err := sql.Open("postgres", dbinfo)
    checkErr(err)
    defer db.Close()

    fmt.Println("# Querying with blacklist in SQL")
    rows, err := db.Query(`
    SELECT * FROM(
        SELECT x from (values ('A'), ('B'), ('C') ) s(x)
    ) As Res1 WHERE x NOT IN ('A');
`)
    checkErr(err)

    for rows.Next() {
        var str string
        err = rows.Scan(&str)
        fmt.Println(str) // Prints B,C
    }

    fmt.Println("Querying with blacklist in Golang")
    blacklist := []string{"A"}

    q := `
    SELECT * FROM(
        SELECT x from (values ('A'), ('B'), ('C') ) s(x)
    ) As Res1 WHERE x NOT IN ($1);

`
    rows, err = db.Query(q, pq.Array(blacklist))
    checkErr(err)

    for rows.Next() {
        var str string
        err = rows.Scan(&str)
        fmt.Println(str) // Prints A, B, C
    }
}

func checkErr(err error) {
    if err != nil {
        panic(err)
    }
}

我将pq.Array作为参数传递给Golang Postgres格式字符串$ 1。但是参数无法通过。当我希望输出B,C时,程序正在打印A,B,C

# Querying with blacklist in SQL
B
C
Querying with blacklist in Golang
A
B
C

1 个答案:

答案 0 :(得分:3)

Postgres的IN不会使用ANYALL这样的数组,您可以使用pq.Array

您可以使用x NOT IN($1)

,而不是使用x <> ALL($1)

来自ALL的文档。

  

评估左手表达式并将其与每个元素进行比较   使用给定运算符的数组,必须产生布尔结果。   如果所有比较都是真的,则ALL的结果为“true”(包括   数组中零元素的情况)。结果是“假”,如果   找到任何错误的结果。