Go 語言操作 mysql 建表問題的解決

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 拆開。

解決辦法:

  1. 將 多條 sql 語句拆開,每個語句單獨執行 db.Exec()
  2. 查看 go-sql-driver 的文檔,發現可以支持一條語句多條 sql 執行。修改代碼如下
db, err := sql.Open("mysql", user+":"+pass+"@tcp("+host+":"+port+")/"+name+"?charset=utf8&multiStatements=true")

增加了 &multiStatements=true 參數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章