基於gin的golang web開發:mysql增刪改查
阿新 • • 發佈:2020-11-13
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迭代方法。