我正在尝试在 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)
- 1 回答
- 0 关注
- 108 浏览
添加回答
举报
0/150
提交
取消