Go 語言操作 mysql 建表問題的解決辦法
- Golang
- mysql
- go-sql-driver
問題
開發中需要利用 go 讀取 sql 文件自動創建表。
table.sql 文件內容如下
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
`name` varchar(30) NOT NULL COMMENT '姓名',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶表';
go 代碼如下:
func createTable() (err error) {
host := "127.0.0.1"
port := "3306"
user := "root"
pass := "admin"
name := "test"
sqlBytes, err = ioutil.ReadFile("docs/databases/table.sql");
if err != nil {
return
}
sqlTable := string(sqlBytes);
fmt.Println(sqlTable)
db, err := sql.Open("mysql", user+":"+pass+"@tcp("+host+":"+port+")/"+name+"?charset=utf8")
if err != nil {
return
}
defer db.Close()
_, err = db.Exec(sqlTable)
if err != nil {
return
}
return nil
}
執行,出錯:
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 'CREATE TABLE `user` (`user_id` int(11) NOT NULL AUTO_INCREMENT COMMEN' at line 1
剛開始是以爲 sql 語句本身有問題,所以將 sql 語句直接粘貼到 mysql 命令行執行,成功。所以不是 sql 語句的問題。
查找資料才知道原因是 mysql 默認是不能在一個語句中同時執行兩條 sql 語句,把 drop table 和 create table 拆開。
解決辦法:
- 將 多條 sql 語句拆開,每個語句單獨執行 db.Exec()
- 查看 go-sql-driver 的文檔,發現可以支持一條語句多條 sql 執行。修改代碼如下
db, err := sql.Open("mysql", user+":"+pass+"@tcp("+host+":"+port+")/"+name+"?charset=utf8&multiStatements=true")
增加了 &multiStatements=true 參數