Postgresql 参数问题 $1

标签 postgresql go parameters martini

我正在努力建立一个数据库,构建一个自定义更新插入,因为 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/

相关文章:

go - 将 int slice 编码到字符串行

C++ 指向函数参数指针的指针

postgresql - Elixir Ecto : How to write a migration with belongs_to and has_many?

postgresql - 准备好的语句: Using unnamed and unnumbered question mark style positional placeholders

go - 使用 map , slice 或 channel 类型进行类型安全

ado.net - oledb/ado.net : Get the command's text, 替换了所有参数

variables - 如何将变量名称作为参数的一部分传递给批处理文件,然后使用它?

postgresql - 在postgres中获取主键序列号

如果用户提供非英语密码,PostgreSQL 安装会中断

python - 在 Go 项目文件夹中运行 python 脚本(使用脚本的项目/相对文件路径)