2015-07-30 3 views
4

Я работаю над настройкой базы данных, создавая пользовательский вариант Upsert as Postgresql, по-видимому, пока этого не имеет. Во всяком случае, мои параметры не играют хорошо.

Я использую Martini.

Этот код:

func CreateBook(ren render.Render, r *http.Request, db *sql.DB) { 
    _, err := db.Query("INSERT INTO books (title, first, last, class) SELECT $1, $2, $3, $4 WHERE NOT EXISTS (SELECT * FROM books WHERE title = $1)", 
    r.FormValue("title"), 
    r.FormValue("first"), 
    r.FormValue("last"), 
    r.FormValue("class")) 

    PanicIf(err) 

Выдает эту ошибку:

pq: inconsistent types deduced for parameter $1 

Я довольно уверен, что это какой-то вопрос типажей со вторым $ 1, но ни один из рациональных решений не кажется, имеет смысл.

Его глупый вопрос, надеюсь, легкий ответ, но я не смог найти ответы нигде.

+0

Вы готовы переписать с пятым параметром вместо повторного '$ 1 '? –

+0

Конечно, но цель состоит в том, чтобы попытаться проверить, что вход html не представляет собой дублируемую запись (отсюда и название). – Sam

ответ

12

Трудно точно сказать, что происходит, поскольку структура базы данных неизвестна. Но пробовать этот запрос в sqlfiddle показывает следующее:

create table books (
    id serial, 
    title varchar 
); 

PREPARE booksplan AS 
    INSERT INTO books (title) 
    SELECT $1 WHERE NOT EXISTS (SELECT * FROM books WHERE title = $1); 

>> ERROR: inconsistent types deduced for parameter $1 
>> Detail: text versus character varying Position: 59 

Так что я подозреваю, что, когда $ 1 используется в первый раз, текст выводится, но VARCHAR выводится для второго $ 1 (как это по сравнению с название, которое является varchar).

Как временное решение, вероятно, можно попробовать

_, err := db.Query(`INSERT INTO books (title, first, last, class) 
    SELECT CAST($1 AS VARCHAR), $2, $3, $4 
    WHERE NOT EXISTS (SELECT 1 FROM books WHERE title = $1)`, 
+0

Обходной путь работал! Спасибо! – Sam

+5

FYI: CAST() также произносится как «::» в PostgreSQL, как в SELECT $ 1 :: VARCHAR, $ 2, ... – Jason

Смежные вопросы