Go语言访问mysql数据库需要用到标准库database/sql和mysql的驱动。标准库的Api使用比较繁琐这里再引入另一个库github.com/jmoiron/sqlx。
1 2 go get github.com/jmoiron/sqlx go get github.com/go-sql-driver/mysql
连接数据库 1 2 3 4 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。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 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分别用来获取单个结果和多个结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 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迭代方法。