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

标签 postgresql variables go

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

我有一个包,里面只有一些数据库查询。这是我的代码。

ma​​in.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 文件。

我已经尝试了几种变体,但还没有任何效果。感谢您的帮助。

最佳答案

看起来您正在使用 https://github.com/lib/pq根据错误消息,它是 docs这么说

pq uses the Postgres-native ordinal markers, as shown above

我从来不知道有一个数据库引擎允许参数化值除值以外的任何形式。我认为您将不得不求助于字符串连接。我现在没有可用的 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

关于postgresql - 关于带变量的 Go sql 查询,我没有得到什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37448982/

相关文章:

postgresql - PostgreSQL 版本在 Kali/Debian 上安装 OpenVAS 问题

linux - 在 Debian Wheezy 上更新 libpq5 (>= 9.4~beta3)

go - 如何恢复我用 gorm deletedAt 软删除的数据

serialization - 使用 Gob 以追加方式将日志写入文件

memory-management - Go 中的变量是否都分配在堆上?

sql - 列的唯一组合的编号

SQL - 如何从两个表中获取数据

php - jQuery 将变量从 PHP 传递到 MySQL

c - C语言中long double的读入

javascript - jQuery 保存局部变量以供稍后在代码中使用