Go語言訪問mysql資料庫需要用到標準庫database/sql
和mysql的驅動。標準庫的Api使用比較繁瑣這裡再引入另一個庫github.com/jmoiron/sqlx
。
go get github.com/jmoiron/sqlx
go get github.com/go-sql-driver/mysql
連線資料庫
db, err := sqlx.Connect("mysql", "...?parseTime=true")
if err != nil {
log.Panicln("db err: ", err.Error())
}
使用sqlx的Connect方法連線資料庫,Connect自動確認是否連線成功,如果出錯的話err返回錯誤資訊。可以在需要連線資料庫的函式中直接連線,也可以使用基於gin的golang web開發:訪問mysql資料庫中介紹的go語言init機制獲取連線。
增刪改
mysql的增刪改使用db的Exec函式,傳入sql語句和查詢引數。sqlx也提供了MustExec函式,在sql語句執行出錯的時候觸發panic而不是返回error。
db, err := sqlx.Connect("mysql", "...?parseTime=true")
if err != nil {
log.Panicln("db err: ", err.Error())
}
defer db.Close()
insertSql := `
INSERT INTO sys_user (
username,
PASSWORD
)
VALUES
(?, ?);
`
result, err := db.Db.Exec(insertSql, username, password)
if err != nil {
log.Panicln("add user err: ", err.Error())
}
updateSql := `
update sys_user
set username = ?
where id = ?;
`
result1, err1 := db.Db.Exec(updateSql, username, id)
if err1 != nil {
log.Panicln("update user by id err: ", err.Error())
}
deleteSql := `
delete from sys_user
where id = ?
`
result2, err2 := db.Db.Exec(deleteSql, id)
if err2 != nil {
log.Panicln("delete user by id err: ", err.Error())
}
Exec函式的結果result介面包含兩個函式LastInsertId,RowsAffected,可以判斷RowsAffected > 0來驗證sql語句的執行結果。注意RowsAffected不是所有資料庫和驅動都支援,如果你用的不是mysql的話需要檢查你的環境是否支援RowsAffected。
查
sqlx支援可以方便把資料庫查詢結果轉換成go結構體,Get和Select分別用來獲取單個結果和多個結果。
type SysUser struct {
Id int `json:"id"`
Username null.String `json:"username"`
Password null.String `json:"password"` // 登入密碼
}
func GetAllUser(request GetAllUserRequest) (list []SysUser) {
strSql := `
select id,
username,
password
from sys_user
`
err = db.Db.Select(&list, strSql)
if err != nil {
log.Panicln("select sys_user err: ", err.Error())
}
return
}
func GetById(id int) (user SysUser) {
sysUser := SysUser{}
dataSql := `
select id,
username,
password
from sys_user
where id = ?
`
err := db.Db.Get(&sysUser, dataSql, id)
if err != nil {
log.Panicln("get user by id err: ", err.Error())
}
return sysUser
}
Select方法獲取所有結果放入記憶體,並轉換為目標結構體,如果結果中包含大量資料的話可以分頁返回,也可以使用Query/StructScan迭代方法。