12

私はデータベースのセットアップに取り組んでおり、Postgresql にはまだそれがないように見えるため、カスタム Upsert を構築しています。とにかく、私のパラメータはうまく機能していません。

マティーニを使用しています。

このコード:

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

2 番目の $1 に関するある種の型キャストの問題であると確信していますが、合理的な解決策はどれも意味をなさないようです。

うまくいけば簡単な答えがある愚かな質問ですが、他のどこにも答えを見つけることができませんでした.

4

1 に答える 1

27

データベースの構造がわからないため、何が起こっているのかを正確に伝えるのは困難です。しかし、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 が初めて使用されると、テキストは推測されますが、2 番目の $1 については varchar が推測されると思います (varchar である title と比較すると)。

回避策として、おそらく試すことができます

_, 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)`,
于 2015-07-30T21:43:36.227 に答える