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