String 将字符串传递到Golang中的Prepared语句

String 将字符串传递到Golang中的Prepared语句,string,postgresql,go,prepared-statement,String,Postgresql,Go,Prepared Statement,想法是我想更新状态,仅当状态不同时才返回id 因此,我准备了一份如下声明: var theQuery = `UPDATE process SET status=$1 WHERE status!=$1 AND id=$2 RETURNING id` 然后我就这样叫它, err = statement.QueryRow("set", 12).Scan(&id) 然后会出现这样的错误 runtime error: invalid memory address or nil pointer

想法是我想更新
状态
,仅当
状态
不同时才返回id

因此,我准备了一份如下声明:

var theQuery = `UPDATE process SET status=$1 WHERE status!=$1 AND id=$2 RETURNING id`
然后我就这样叫它,

err = statement.QueryRow("set", 12).Scan(&id)
然后会出现这样的错误

runtime error: invalid memory address or nil pointer dereference
status := "set"
err = statement.QueryRow(status, status, 12).Scan(&id)
当我尝试时:

var theQuery = `UPDATE process SET status='$1' WHERE status!='$1' AND id=$2 RETURNING id`
它运行。然后,当我再次运行它时,我希望得到
没有行
,但它仍然返回id。看起来它仍然在更新行并忽略了
状态!='$1'
零件


谢谢

所以,我找到了解决办法。准备好的语句将接收3个参数,而不是两次使用
$1

var theQuery = `UPDATE process SET status=$1 WHERE status!=$2 AND id=$3 RETURNING id`
然后,我这样称呼准备好的声明

runtime error: invalid memory address or nil pointer dereference
status := "set"
err = statement.QueryRow(status, status, 12).Scan(&id)

我知道也许这不是解决问题的最好办法。但是它对我有效。

QueryRow()
通常接受一个查询字符串,后跟n个参数。不确定
“set”
正在做什么。您的意思是通过查询吗?类似于
QueryRow(查询,arg1,arg2)
@anthony,即
Stmt.QueryRow()
,它只接受args。声明已经准备好了。您将得到一个错误,因为在该语句中有两个参数($1和$2),但您只传递了一个(“set”)。“为什么?”雷芬斯皮尔:对不起,我的错误。我写错了。好的,我已经编辑了这个问题。事实上,我只是找到了解决办法。我会回答的。这真的很有意思,它解决了这个问题。我想知道根本原因是什么。另外,如果您只使用裸
数据库/sql
包,我建议您使用
github.com/jmoiron/sqlx
。它附带了一些额外的功能,非常好。除非你不想使用第三方库。我也很好奇为什么两次使用
$1
都不管用。我会保留这个问题,希望其他人知道。是的,我现在正在使用
database/sql
,但我将
github.com/jmoiron/sqlx
保留在下一个项目中。