基於gin的golang web開發:mysql增刪改查

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迭代方法。

文章出處:基於gin的golang web開發:mysql增刪改查

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