Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 应为0个参数,但得到1个_Mysql_Go - Fatal编程技术网

Mysql 应为0个参数,但得到1个

Mysql 应为0个参数,但得到1个,mysql,go,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.acct

我遇到一个错误,在互联网上看不到任何修复。我是刚接触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 workspace上尝试SQL语句时,它工作正常。

db.Exec有以下签名

func (db *DB) Exec(query string, args ...interface{}) (Result, error)
Args是一个varargs参数,这意味着您可以放置任意数量的数据。但是,对于传递给Exec的每个变量,sql查询中都应该有一个“?”。你得到错误的原因是你传递了nil,你应该什么都不传递

改变

err = db.Exec(sql, nil)

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

sql = "UPDATE tablename SET id1='' WHERE id2=?"
然后像这样运行exec

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

之所以出现错误,是因为您将
nil
作为第二个参数传递给Exec,而您的查询没有指定参数占位符(
$1
在postgres中,
在mysql中)

相反,你可以这样做

db.Exec("UPDATE tablename SET id1='' WHERE id2=?", v.acctId)
此外,您几乎不应该通过连接字符串来构造查询,因为这会导致SQL注入。所以请使用参数占位符

如果您想执行一个没有参数的查询,那么只需执行您正在执行的操作,不要将
nil
作为第二个参数传递

db.Exec(sql)

您不应该像这样在查询中插入参数。请参阅关于正确用法的说明。它是带有行的部分吗,err:=db.Query(“从用户中选择名称,其中年龄=1”,年龄)
db.Exec(“更新表名集id1=”,其中id2=$1),v.acctId)
我无法使用$1。它说的是错误1054:where子句中的未知列“$1”ok@halfer,我将在下次第一列似乎已经解决了这个问题。如果我已经确定的话,我会接受它。你永远不应该通过连接字符串来传递参数。这是SQL注入的攻击向量。用这个?语法并将其作为参数传递。
db.Exec(sql)