基于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增删改查