我正在努力建立一个数据库,构建一个自定义更新插入,因为 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)`,
关于Postgresql 参数问题 $1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31733790/