Postgresql参数问题$1



我正在建立一个数据库,建立一个自定义的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的某种类型转换问题,但没有一个合理的解决方案似乎是有意义的。

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

由于不知道数据库结构,很难确切地知道发生了什么。但是在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时,文本被推断出来,但第二个$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)`,

最新更新