我正在尝试在 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 得到的错误是:
Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? (id bigint(20) NOT NULL AUTO_INCREMENT, username varchar(100) NOT NULL, passwo' at line 1
如果我用表名 dokimi03
替换 ?
,代码就会运行(当然还要删除 pinakas
var)。
我搜索过文档,?
似乎是表示 Go-MySQL 上变量的正确字符。我错过了什么?
最佳答案
?
是 MySQL 中参数占位符的正确字符,但不能将参数用作表标识符。
参数只能用作标量值的替代,不能用作标识符、SQL 关键字或表达式等。
这不仅与 MySQL 相关,也不仅与 Go 连接器相关。它是 SQL 语言的每个实现中的标准(有一些连接器通过进行字符串替换来伪造参数,但 MySQL 的 Go 连接器不会这样做)。
在将表名称传递给 db.Exec()
之前,必须在 SQL 字符串中固定表名称。
例如,我会这样写:
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)
关于mysql - 将 Go var 传递到 MySQL - 尝试在 Go lang 程序(MySQL db)中执行 db.Exec 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74376932/