首页 > 解决方案 > Go中的错误MySQL

问题描述

此代码有效:

stmt, err := db.Prepare("UPDATE `test` SET `score` = ? WHERE id = ?")
CheckErr(err)
_, err = stmt.Exec(value, id)

但是当我更改代码时,它不起作用:

stmt, err := db.Prepare("UPDATE `test` SET ? = ? WHERE id = ?")
CheckErr(err)
_, err = stmt.Exec("score", value, id)

有什么问题?

标签: mysqlsqlgosql-update

解决方案


无论好坏,参数只能用于查询中的文字常量。这些通常是where子句中的比较值,有时是selectorset子句中的常量——在查询的其他部分中很少见。

标识符不是文字常量。事实上,以下都不是:

  • 数据库、表和列名
  • 函数名
  • 运算符(例如+
  • 关键字(例如asc/ descin order by

不幸的是,要实现这些“动态”,您需要通过直接修改字符串来修改查询字符串。那是相当令人讨厌的,但别无选择。

这种方法的好处之一是它允许数据库存储然后重新使用查询计划。对于非常快速的查询,消除编译阶段可能是一个重要的性能提升。

编辑:

我真的不知道去,但想法是:

sql := "UPDATE `test` SET [col] = ? WHERE id = ?"

sql = strings.replace(sql, "[col]", "score")

stmt, err := db.Prepare(sql)
CheckErr(err)
_, err = stmt.Exec(value, id)

换句话说,直接更改标识符的查询字符串。继续为值使用参数。


推荐阅读