Postgresql参数问题$1

Postgresql参数问题$1,postgresql,go,parameters,martini,Postgresql,Go,Parameters,Martini,我正在建立一个数据库,建立一个自定义的Upsert,因为Postgresql显然还没有。无论如何,我的参数不是很好 我在喝马提尼酒 此代码: 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 (SEL

我正在建立一个数据库,建立一个自定义的Upsert,因为Postgresql显然还没有。无论如何,我的参数不是很好

我在喝马提尼酒

此代码:

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美元的类型转换问题,但是没有一个合理的解决方案是有意义的


这是一个愚蠢的问题,希望答案很简单,但我在其他任何地方都找不到任何答案。

由于数据库结构未知,很难准确说出到底发生了什么。但在SQLFIDLE中尝试此查询会显示以下内容:

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时,文本被推导,但是第二次使用$1时,varchar被推导(与title相比,它是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)`,

您是否愿意用第五个参数来重写它,而不是重用
$1
?当然可以,但目标是尝试验证html输入不代表重复的条目(因此标题)。仅供参考:CAST()也发音为:“在PostgreSQL中,如SELECT$1::VARCHAR,$2。。。