有一个条件表titles
:
Column | Type | Collation | Nullable | Default
-------------------+------------------------+-----------+----------+----------------------------------------------
id | integer | | not null | nextval('indexing_results_id_seq'::regclass)
document_id | integer | | |
title | character varying(255) | | not null |
normalized_title | tsvector | | not null |
我在其中添加了一个新行:
documentId := 1
title := "Some title"
_, err = connect.Query(currentContext,
"INSERT INTO titles (document_id, title, normalized_title) VALUES ($1, $2, to_tsvector($2))",
&documentId, &title) //передаём title один раз, но используем его в запросе дважды
但作为回应,我得到一个错误:
ERROR: inconsistent types deduced for parameter $2 (SQLSTATE 42P08)
出于某种原因,PostgreSQL 不喜欢参数号 2(它在查询中使用了两次)。
如果您指定类型(至少在其中一个地方),则新行将正常添加并且不会显示错误:
_, err = connect.Query(currentContext,
"INSERT INTO titles (document_id, title, normalized_title) VALUES ($1, $2::varchar(255), to_tsvector($2))",
&documentId, &title) //указали приведение типа
它还有助于将相同的变量传递title
2 次:
_, err = connect.Query(currentContext,
"INSERT INTO titles (document_id, title, normalized_title) VALUES ($1, $2, to_tsvector($3))",
&documentId, &title, &title) //вместо двух переменных передаём три
如果您不填写其中一个字段,则一切正常:
_, err = connect.Query(currentContext,
"INSERT INTO titles (document_id, title, normalized_title) VALUES ($1, '', to_tsvector($2))",
&documentId, &title) //пропустили поле title
我不知道为什么我不能在不强制转换的情况下title
在查询 ( $1, $2, $2
) 中使用变量 2 次或更多次?为什么类型转换有助于摆脱这个错误?在代码中,我已经多次修改了所有内容,但我仍然无法弄清楚为什么会这样。
PS 如果重要,我使用pgx驱动程序与 PostgreSQL (version 12) 一起工作。
正如Akina在对此问题的评论中所写,不同的字段需要不同的值:
title
-varying(255)
to_tsvector()
-text
因此,我们需要指定类型转换。这是最终的解决方案: