mysql - 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)
有什么问题?
解决方案
无论好坏,参数只能用于查询中的文字常量。这些通常是where
子句中的比较值,有时是select
orset
子句中的常量——在查询的其他部分中很少见。
标识符不是文字常量。事实上,以下都不是:
- 数据库、表和列名
- 函数名
- 运算符(例如
+
) - 关键字(例如
asc
/desc
inorder 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)
换句话说,直接更改标识符的查询字符串。继续为值使用参数。
推荐阅读
- assembly - TLB 是否包含在内?
- excel - 从过滤表中获取可见数据
- python - Python-pptx - 将图片插入形状和动画
- java - 如何在Android parse.com Java中获取类的所有列名
- java - 当两个 logback.xml 在 Websphere 服务器上运行时,日志被合并
- javascript - 无法弄清楚为什么应用程序没有部署到heroku
- python - 熊猫数据框是从右到左?
- azure - Azure 管道未运行 - 属性参数为空
- python-3.x - 匀称的循环不创建线串
- ios - 在 macOS 10.13(或 iOS 12)及更早版本上将 WKWebView 的继承外观设置为 InterfaceStyle: .Dark