关于带变量的Go sql查询,我没有得到什么?

时间:2016-05-25 23:00:10

标签: postgresql variables go

我是Go的新手,我已经开始处理一些postgres查询,而且我的运气很少。

我有一个包,它只会包含一些数据库查询。这是我的代码。

main.go

package main

import (
    "fmt"
)

func main() {

    fmt.Println("Querying data")
    myqueries.SelectAll("mytable")

}

myqueries.go

package myqueries

import (
    "database/sql"
    "fmt"
)

func SelectAll (table string) {
    db, err := sql.Open("postgres","user=postgres dbname=mydb sslmode=disable")

        if err != nil {
                 fmt.Println(err)
        }

        defer db.Close()

        rows, err := db.Query("SELECT * FROM $1", table)

        if err != nil {
                fmt.Println(err)
        } else {

                PrintRows(rows)
        }

}

func PrintRows(rows *sql.Rows) {
    for rows.Next() {
        var firstname string
        var lastname string

        err := rows.Scan(&firstname, &lastname)

        if err != nil {
            fmt.Println(err)
        }
        fmt.Println("first name | last name")

        fmt.Println("%v | %v\n", firstname, lastname)

    }
}

我得到的错误是pq: syntax error at or near "$1"

来自db.Query中的 myqueries.go 文件。

我尝试了几种变体,但还没有任何效果。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:5)

看起来您正在使用基于错误消息的https://github.com/lib/pq而且它docs

  

pq使用Postgres原生的序数标记,如上所示

我从来不知道数据库引擎允许除了值以外的任何参数化值。我认为你将不得不诉诸字符串连接。我现在没有可用的Go编译器,但尝试这样的东西。因为您通过连接插入表名,所以需要对其进行清理。 pq.QuoteIdentifier应该能够提供帮助。

func SelectAll (table string) {
    db, err := sql.Open("postgres","user=postgres dbname=mydb sslmode=disable")

        if err != nil {
                 fmt.Println(err)
        }

        defer db.Close()

        table = pq.QuoteIdentifier(table)
        rows, err := db.Query(fmt.Sprintf("SELECT * FROM %v", table))

        if err != nil {
                fmt.Println(err)
        } else {

                PrintRows(rows)
        }

}

编辑:感谢hobbs指出pq.QuoteIdentifier