我是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 文件。
我尝试了几种变体,但还没有任何效果。任何帮助表示赞赏。
答案 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