英文:
"Operator does not exist: integer =?" when using Postgres
问题
我有一个简单的SQL查询,使用go的database/sql包提供的QueryRow方法调用。
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)
}
然而,我得到了错误信息 pq: operator does not exist: integer =?
。看起来代码无法理解 ?
只是一个占位符。我该如何修复这个问题?
英文:
I have a simple SQL query called within the QueryRow method provided by go's database/sql package.
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)
}
However, I'm getting the error pq: operator does not exist: integer =?
It looks like the code doesn't understand that the ?
is just a placeholder. How can I fix this?
答案1
得分: 19
PostgreSQL使用编号占位符($1
,$2
,...)而不是通常的位置问号。Go接口的文档在示例中也使用了编号占位符:
rows, err := db.Query("SELECT name FROM users WHERE age = $1", age)
看起来Go接口没有像许多其他接口那样将问号转换为编号占位符,所以问号一直传递到数据库并导致混淆。
你可以使用编号占位符而不是问号:
row := db.QueryRow(
"SELECT name FROM users WHERE id = $1", id)
英文:
PostgreSQL works with numbered placeholders ($1
, $2
, ...) natively rather than the usual positional question marks. The documentation for the Go interface also uses numbered placeholders in its examples:
rows, err := db.Query("SELECT name FROM users WHERE age = $1", age)
Seems that the Go interface isn't translating the question marks to numbered placeholders the way many interfaces do so the question mark is getting all the way to the database and confusing everything.
You should be able to switch to numbered placeholders instead of question marks:
row := db.QueryRow(
"SELECT name FROM users WHERE id = $1", id)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论