将字段与占位符进行比较 - PostgreSQL
我正在使用Go在PostgreSQL数据库上执行查询。请注意,在DB id
中输入bigint
。将字段与占位符进行比较 - PostgreSQL
db.Exec("UPDATE tags SET association_count = association_count - 1 WHERE id=?;", id)
当我运行这段代码,我得到一个SQL错误
operator does not exist: bigint =?
从我可以告诉这是由id
和?
之间的打字不匹配造成的。我已经尝试使用::
进行投射,但它会抛出一个错误,并且没有发现任何关于此的内容。有趣的是,如果有一个空格,如id = ?
,则会引发一般性语法错误。任何想法如何施展或解决这个问题?
Postgres使用$#
占位符postgres docs
当创建准备语句,由位置参考参数,使用$ 1,$ 2等的参数数据类型的对应列表可以任选地指定。如果未指定参数的数据类型或将其声明为未知数据类型,则从使用该参数的上下文(如果可能)推断该类型。执行语句时,请在EXECUTE语句中指定这些参数的实际值。请参阅EXECUTE以获得更多关于这方面的信息。
所以尽量
result, err := db.Exec(`
UPDATE tags
SET association_count = association_count - 1
WHERE id=$1;`, id
)
这里是result样子
UPDATE: a_horse_with_no_name使得一个好点。 这取决于您正在使用的客户端库。我认为这是pq,因为这是在golang的postgres流行。
请注意,手册中的注释是指过程语言中的语句,例如PL/pgSQL。处理“客户”语言的占位符由语言驱动程序处理。在JDBC中,placehoder _is_'?'和'$ 1'不会在那里工作。所以在这种情况下,显然Go的驱动程序使用与后端相同的语法。但是手册中的引用并没有真正指向应用程序语言中的预准备语句 –
@a_horse_with_no_name这是一个很好的观点。我假设OP使用pq模仿postgres的$ 1'语法。 – poopoothegorilla
@poopoothegorilla另一个小点:'id'后需要一个逗号:) – Snowman
这不是一个类型问题。问题是占位符没有被替换,或者'id'变量的值是'? ' –
问题可能是分号吗? –
@ClodoaldoNeto你的意思是'id'变量的值是'?'?像Postgres不知道它正在查看哪个'id'? – cfatt10