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

8cdiaqws  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(89)

我试图在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上表示变量的合适字符。我遗漏了什么?

vddsk6oq

vddsk6oq1#

?是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)

相关问题