"运算符不存在:整数=?" 与Golang一起使用Postgres时

ume*_*ezo 5 sql postgresql go pq

我在go的database/sql包提供的QueryRow方法中调用了一个简单的SQL查询.

import (
  "github.com/codegangsta/martini"
  "github.com/martini-contrib/render"
  "net/http"
  "database/sql"
  "fmt"
  _ "github.com/lib/pq")
)

type User struct {
  Name string
}

func Show(db *sql.DB, params martini.Params) {
  id := params["id"]
  row := db.QueryRow(
    "SELECT name FROM users WHERE id=?", id)
  u := User{}
  err := row.Scan(&u.Name)
  fmt.Println(err)
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到错误pq: operator does not exist: integer =?看起来代码不明白它?只是一个占位符.我怎样才能解决这个问题?

mu *_*ort 15

PostgreSQL 本身使用编号占位符($1,, $2...),而不是通常的位置问号.Go接口文档也在其示例中使用了编号占位符:

rows, err := db.Query("SELECT name FROM users WHERE age = $1", age)
Run Code Online (Sandbox Code Playgroud)

似乎Go接口没有按照许多接口的方式将问号转换为编号的占位符,因此问号一直到达数据库并使所有内容混乱.

您应该能够切换到编号的占位符而不是问号:

 row := db.QueryRow(
    "SELECT name FROM users WHERE id = $1", id)
Run Code Online (Sandbox Code Playgroud)

  • 知道了谢谢。我没有意识到这一点,因为数据库/sql 的 go 文档使用了问号。http://golang.org/pkg/database/sql/#NullString (2认同)
  • umezo:我确定你已经去过那里了,但是也值得阅读你的postgresql驱动程序的文档(而且不仅仅是因为美元问题):http://godoc.org/github.com/lib/pq (2认同)