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

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

相關文章