为了账号安全,请及时绑定邮箱和手机立即绑定

将 Go var 传递给 MySQL - 在 Go lang 程序 (MySQL db) 中尝试执行

将 Go var 传递给 MySQL - 在 Go lang 程序 (MySQL db) 中尝试执行

Go
眼眸繁星 2023-03-15 13:44:21
我正在尝试在 db.Exec 中传递一个 Go 变量:    pinakas := "dokimi03"    crTable := `CREATE TABLE ? (id bigint(20) NOT NULL AUTO_INCREMENT, username varchar(100) NOT NULL, password varchar(100) NOT NULL, email varchar(100) NOT NULL, PRIMARY KEY (id));`    _, errCreate := db.Exec(crTable, pinakas)    if errCreate != nil {        log.Println(errCreate)    }运行代码时从 MySQL 得到的错误是:错误 1064:您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在 '? 附近使用的正确语法。(id bigint(20) NOT NULL AUTO_INCREMENT, username varchar(100) NOT NULL, passwo' 在第 1 行?如果我用dokimi03表名替换,代码就会运行(pinakas当然还要删除 var)。我搜索了文档,?似乎是在 Go-MySQL 上表示变量的合适字符。我错过了什么?
查看完整描述

1 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

?是 MySQL 中参数占位符的正确字符,但不能将参数用作表标识符。


参数只能用作标量值的替代品,不能用作标识符、SQL 关键字或表达式等。


这不仅与 MySQL 相关,也不仅与 Go 连接器相关。它在 SQL 语言的每个实现中都是标准的(有一些连接器通过字符串替换来伪造参数,但 MySQL 的 Go 连接器不这样做)。


在将表名传递给 之前,表名必须固定在 SQL 字符串中db.Exec()。


例如,我会这样写:


pinakas := "dokimi03"

crTable := fmt.Sprintf("CREATE TABLE `%s` (id bigint(20) NOT NULL AUTO_INCREMENT, username varchar(100) NOT NULL, password varchar(100) NOT NULL, email varchar(100) NOT NULL, PRIMARY KEY (id))", pinakas)



查看完整回答
反对 回复 2023-03-15
  • 1 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信