mysql - 将 Go var 传递到 MySQL - 尝试在 Go lang 程序(MySQL db)中执行 db.Exec 时出错

标签 mysql go

我正在尝试在 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/

相关文章:

string - 如何在 Golang 中将映射解压缩为字符串格式的关键字参数?

go - 交叉编译到 ARMv7 失败

python - 为什么在写入之前休眠会减慢后续写入的速度?

MySQL索引优化

php - 如何使用 AJAX 在 PHP、MySQL 中启动进程,然后停止

mysql - Sequelize 如何在查询中格式化 sequelize.literal ('CURRENT_TIMESTAMP' )?

recursion - 在 Go 中使用递归引用

python - 安装后出现mysqlclient无法安装的错误?

mysql - 使用 SUM 查找列中的总金额,然后按人分组

javascript - http.FileServer 响应错误 mime "Content-Type"