预计0个参数,得1

时间:2017-11-03 11:05:25

标签: mysql go

我收到错误,但我无法在互联网上找到任何解决方法。我是go-lang的新手,我在SQL语句中看不到任何错误。我在go-lang执行更新查询。代码是:

sql = "UPDATE tablename SET id1='' WHERE id2=" +fmt.Sprint(v.acctId)
_, err = db.Exec(sql, nil)

id1和id2都是varchar。我将SQL语句放在一个字符串中然后执行它。我尝试删除其中一个ID,但它仍然显示错误。我注意到的是v.acctId的值由于某种原因并不总是相同的。我不知道为什么会这样,因为当我在MySQL工作区上尝试SQL语句时,它运行正常。

2 个答案:

答案 0 :(得分:2)

您收到错误的原因是,当您的查询没有参数占位符(SELECT part_id , subscription, license = ISNULL(policylicense,enterpriselic) FROM <table> WHERE policylicense IS NOT NULL OR enterpriselic IS NOT NULL 在postgres中,nil在mysql i中时,您将$1作为第二个参数传递给Exec相信)指定。

而是做这样的事情

?

此外,您几乎不应该通过连接字符串来构造查询,因为这会导致SQL注入。所以请使用param占位符。

如果你想执行一个没有参数的查询,那就做你正在做的事情,不要将db.Exec("UPDATE tablename SET id1='' WHERE id2=?", v.acctId) 作为第二个参数传递。

nil

答案 1 :(得分:-1)

db.Exec具有以下签名

func (db *DB) Exec(query string, args ...interface{}) (Result, error)

Args是一个varargs参数,这意味着您可以根据需要添加尽可能多的数据。但是,对于传递给Exec的每个变量,应该有一个&#34;?&#34;在你的SQL查询中。您收到错误的原因是您将其传递给nil,您应该将其传递给任何内容。

更改

err = db.Exec(sql, nil)

err = db.Exec(sql)

或者,您可以将查询重构为以下

sql = "UPDATE tablename SET id1='' WHERE id2=?"

然后像这样运行exec

err = db.Exec(sql, fmt.Sprint(v.acctId))