2015-04-27 5 views
2

У меня есть простой SQL-запрос, вызванный в методе QueryRow, предоставляемый пакетом go/database sql.«Оператор не существует: integer =?» при использовании Postgres с Golang

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 =? Похоже, что код не понимает, что ? просто заполнитель. Как я могу это исправить?

+3

Причина вы получите, что конкретная ошибка в том, что '=' будет действительным именем оператора PostgreSQL?. Используйте 'id =?'. Но, как говорит му, вполне вероятно, что Go не использует '?' В качестве заполнителя. –

ответ

12

PostgreSQL работает с пронумерованными заполнителями ($1, $2, ...) вместо обычных позиционных вопросительных знаков. documentation for the Go interface также использует пронумерованные заполнители в своих примерах:

rows, err := db.Query("SELECT name FROM users WHERE age = $1", age) 

Кажется, что интерфейс Go не переводит вопросительные знаки в пронумерованных заполнители, как многие интерфейсы сделать это знак вопроса становится все пути к базе данных и все запутывает.

Вы должны быть в состоянии переключиться на пронумерованные заполнителей вместо знаков вопроса:

row := db.QueryRow(
    "SELECT name FROM users WHERE id = $1", id) 
+1

получил, спасибо. Я этого не понимал, так как go docs для базы данных/sql используют знак вопроса. http://golang.org/pkg/database/sql/#NullString – umezo

+1

umezo: Я уверен, что вы уже были там, но стоит также прочитать документацию для вашего драйвера postgresql (и не только для долларовой проблемы): http://godoc.org/github.com/lib/pq – tomasz