Golang使用SQLX包操作MySQL数据库

高能预警

  • 博主在学习使用 database/sql 操作 MySQL 时踩了太多坑,且在测试的过程中也没能完全解决掉bug,为了完成任务,只得在 GitHub 上找到了一个封装程度更高的 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.55.7.341.3.41.6.0

感谢阅读。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值