高能预警
- 博主在学习使用
操作 MySQL 时踩了太多坑,且在测试的过程中也没能完全解决掉bug,为了完成任务,只得在 GitHub 上找到了一个封装程度更高的database/sql
sqlx
包。相比之下,sqlx 还是显得非常银杏(人性)化的。本文将使用博主习惯的——拆分模块的方式讲解如何使用 sqlx 包对 MySQL 数据库进行增删改查等。
准备开始
- 为项目安装 go-sql-driver 和 sqlx 包
go get -u github.com/go-sql-driver/mysql
go get -u github.com/jmoiron/sqlx
- 导入它们
package main
import (
"github.com/jmoiron/sqlx"
_ "github.com/go-sql-driver/mysql"
)
- 准备好数据库的样例数据
- 按照数据库内数据格式创建结构体
请注意这里的tag
要与数据库的字段一致
type CSqlx struct {
Id int `db:"id"`
Name string `db:"name"`
Notes string `db:"notes"`
}
正式开始
创建与数据库的连接
func main() {
db := DBConn("mysql",
"root:123456@tcp(localhost:3306)/csdn?charset=utf8&parseTime=true")
}
func DBConn(driverName, userText string) *sqlx.DB {
db, err := sqlx.Connect(driverName, userText)
if err != nil {
// 这里读者可以根据自己喜欢的方式处理异常
log.Fatal(err)
}
return db
}
查询单条数据
func SelectOne(db *sqlx.DB) CSqlx {
var c CSqlx
sqlStr := "SELECT * FROM csdn_sqlx WHERE id=?"
err := db.Get(&c, sqlStr, 1)
if err != nil {
log.Fatal(err)
}
return c
}
查询多条数据
func SelectAll(db *sqlx.DB) []CSqlx {
var c []CSqlx
sqlStr := "SELECT * FROM csdn_sqlx WHERE id>0"
err := db.Select(&c, sqlStr)
if err != nil {
log.Fatal(err)
}
return c
}
- 综合上面来看,在完成一个查询动作时,需要创建对应的实例,作为查询结果的载体。其次即编写SQL语句,在SQL字符串中本例使用了 “
?
” 对数据进行站位,通过调用db.Get()
方法,依次传入结构体指针
、SQL语句
以及所有用来替换 “?” 的数据
(可选、可多个),最后进行error信息判断,并返回查询结果。
增加数据
func Insert(db *sqlx.DB, c []CSqlx) error {
valueStrings := make([]string, 0, len(c))
valueArgs := make([]interface{}, 0, len(c)*2)
for _, v := range c {
valueStrings = append(valueStrings, "(?, ?, ?)")
valueArgs = append(valueArgs, v.Id, v.Name, v.Notes)
}
sqlStr := fmt.Sprintf("INSERT INTO csdn_sqlx (id,name,notes) VALUES %s",
strings.Join(valueStrings, ","))
_, err := db.Exec(sqlStr, valueArgs...)
if err != nil {
return err
}
return nil
}
- 这种增加数据的方式相对麻烦,但是容易让人(笨b博主)理解。首先创建两个切片,其中
valueStrings
用来存储 “?
” 占位符字符串,valueArgs
用来存储结构体实例数据展开后每项的内容。套在for
循环内填充两个切片。最后使用db.Exec()
执行操作(其参数同上述Get
方法和Select
方法),通过error信息即可判断是否完成插入。
删除数据
func Delete(db *sqlx.DB) error {
sqlStr := "DELETE FROM csdn_sqlx WHERE id=?"
_, err := db.Exec(sqlStr, 7)
if err != nil {
return err
}
return nil
}
更新数据
func Update(db *sqlx.DB) error {
sqlStr := "UPDATE csdn_sqlx SET name='qqqqqqqqq' WHERE id=?;"
_, err := db.Exec(sqlStr, 6)
if err != nil {
return err
}
return nil
}
- 可以看到,删除数据和更新数据都是非常简单的,只需要和查询数据一样执行一次SQL语句就可以了。当然,也可以把
db.Exec()
换成db.Query()
、db.Queryx()
等其他方法,这里就不再过多赘述其不同了(毕竟博主讲究一个“开箱即用”)。
环境
Go版本 | MySQL数据库版本 | sqlx版本 | go-sql-driver版本 |
---|---|---|---|
1.16.5 | 5.7.34 | 1.3.4 | 1.6.0 |
感谢阅读。