2016-05-23 124 views
0

我正在使用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 = ?,则会引发一般性语法错误。任何想法如何施展或解决这个问题?

+0

这不是一个类型问题。问题是占位符没有被替换,或者'id'变量的值是'? ' –

+0

问题可能是分号吗? –

+0

@ClodoaldoNeto你的意思是'id'变量的值是'?'?像Postgres不知道它正在查看哪个'id'? – cfatt10

回答

3

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流行。

+2

请注意,手册中的注释是指过程语言中的语句,例如PL/pgSQL。处理“客户”语言的占位符由语言驱动程序处理。在JDBC中,placehoder _is_'?'和'$ 1'不会在那里工作。所以在这种情况下,显然Go的驱动程序使用与后端相同的语法。但是手册中的引用并没有真正指向应用程序语言中的预准备语句 –

+0

@a_horse_with_no_name这是一个很好的观点。我假设OP使用pq模仿postgres的$ 1'语法。 – poopoothegorilla

+0

@poopoothegorilla另一个小点:'id'后需要一个逗号:) – Snowman

相关问题