我试图在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服务器版本对应的手册,以了解在第1行“?(id bigint(20)NOT NULL AUTO_INCREMENT,username varchar(100)NOT NULL,passwo”附近使用的正确语法
如果用表名dokimi03
替换?
(当然还要删除pinakas
var),代码就会运行。
我已经搜索了文档,?
似乎是Go-MySQL上表示变量的合适字符。我遗漏了什么?
1条答案
按热度按时间vddsk6oq1#
?
是MySQL中参数占位符的正确字符,但不能将参数用于表标识符。参数只能用作标量值的替代,而不能用作标识符、SQL关键字或表达式等。
这不仅与MySQL有关,也不仅与Go连接器有关,它是SQL语言的每个实现中的标准(有些连接器通过字符串替换来伪造参数,但MySQL的Go连接器没有这样做)。
在将表名传递给
db.Exec()
之前,必须在SQL字符串中修复该表名。例如,我会这样写: