我正在嘗試在 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、 表名替換代碼(當然洗掉pinakasvar ),代碼就會運行。
我搜索了檔案,?似乎是在 Go-MySQL 上表示變數的合適字符。我錯過了什么?
uj5u.com熱心網友回復:
?是 MySQL 中引數占位符的正確字符,但不能將引數用于表識別符號。
引數只能用作標量值的替代品,不能用作識別符號、SQL 關鍵字或運算式等。
這不僅與 MySQL 相關,而且不僅與 Go 連接器相關。它在 SQL 語言的每個實作中都是標準的(有一些連接器通過字串替換來偽造引數,但 MySQL 的 Go 連接器不這樣做)。
在將表名傳遞給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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/530834.html
標籤:mysql去
上一篇:如何用CTE重寫連接查詢?
