"Оператор не существует: целое число =?" при использовании Postgres с Golang
У меня есть простой запрос SQL, вызываемый в методе QueryRow, предоставляемый пакетом go database/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)
}
Однако я получаю ошибку pq: operator does not exist: integer =?
Похоже, код не понимает, что ?
это просто заполнитель. Как я могу это исправить?
1 ответ
Решение
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)