我正在尋找一個可靠的解決方案來連接到Go的MySQL數據庫。我見過一些庫,但很難確定完整性和當前維護的不同狀態。我沒有複雜的需求,但我想知道人們依賴什麽,或者什麽是連接MySQL的最標準的解決方案。
最佳解決方案
有一些驅動程序可用,但您應該隻考慮那些實現了database/sql API的驅動程序,及滿足如下條件:
- 提供了一個幹淨有效的語法,
- 確保您可以在不更改代碼的情況下更改驅動程序,除了導入和連接。
兩個快速可靠的驅動程序可用於MySQL:
我在生產中使用了它們,程序運行了幾個月,數百萬的連接數沒有出現過失敗的情況。
其他SQL數據庫驅動程序are listed on go-wiki。
使用MyMySQL時導入:
import (
"database/sql"
_ "github.com/ziutek/mymysql/godrv"
)
使用Go-MySQL-Driver時導入:
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
使用MyMySQL連接和關閉:
con, err := sql.Open("mymysql", database+"/"+user+"/"+password)
defer con.Close()
// here you can use the connection, it will be closed when function returns
使用Go-MySQL-Driver連接和關閉:
con, err := sql.Open("mysql", store.user+":"+store.password+"@/"+store.database)
defer con.Close()
選擇一行:
row := con.QueryRow("select mdpr, x, y, z from sometable where id=?", id)
cb := new(SomeThing)
err := row.Scan(&cb.Mdpr, &cb.X, &cb.Y, &cb.Z)
選擇多行並構建一個包含結果的數組:
rows, err := con.Query("select a, b from item where p1=? and p2=?", p1, p2)
if err != nil { /* error handling */}
items := make([]*SomeStruct, 0, 10)
var ida, idb uint
for rows.Next() {
err = rows.Scan(&ida, &idb)
if err != nil { /* error handling */}
items = append(items, &SomeStruct{ida, idb})
}
插入 :
_, err = con.Exec("insert into tbl (id, mdpr, isok) values (?, ?, 1)", id, mdpr)
你會發現在Go with MySQL中工作是一種愉快的體驗:我從來沒有遇到過問題,我的服務器運行了幾個月而沒有錯誤或泄漏。大多數函數隻是采用可變數量的參數這一事實減輕了許多語言中繁瑣的任務。
請注意,如果將來需要使用另一個MySQL驅動程序,則隻需在一個go文件中更改兩行:執行導入的行和打開連接的行。
參考資料