"Оператор не существует: целое число =?" при использовании 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)
Другие вопросы по тегам