Go语言sqlx包

sqlx库使用指南

在项目中比起常用的database/sql连接mysql数据库,sqlx的封装程度会更高,操作会更加便捷,此处我们记录sqlx如何操作mysql。

安装sqlx

go get github.com/jmoiron/sqlx

基本使用

连接数据库
package main

//sqlx示例

import (
"fmt"

_ "github.com/go-sql-driver/mysql"   //驱动
"github.com/jmoiron/sqlx"
)

var DB *sqlx.DB

type User struct {
ID   int   `db:"id"`
Name string `db:"name"`
Age int   `db:"age"`
}

func initDB() (err error) {
dsn := "Test:123456@tcp(172.23.102.55:3306)/go_db"
DB, err = sqlx.Connect("mysql", dsn)
if err != nil {
return
}
return nil
}
查询
1)单条查询
//单条查询操作
func queryDemo() {
sqlStr := "select id,name,age from info where id = ?"
user := User{}
err := DB.Get(&user, sqlStr, 1) //单条查询使用Get
if err != nil {
fmt.Printf("query failed,err:%v\n", err)
return
}
fmt.Printf("user:%#v\n", user)
fmt.Printf("user:%v\n", user)
}

2)多条查询
//查询多条
func queryMultiDemo() {
sqlStr := "select id,name,age from info where id > ?"
var users []User
err := DB.Select(&users, sqlStr, 0)
if err != nil {
fmt.Println("query multi failed,err:%v\n", err)
return
}
fmt.Printf("users: %v\n", users)
for _, user := range users {
fmt.Printf("user:%v\n", user)
}
}
插入

sqlx中exec方法和原生sql中的exec使用基本一致

// 插入数据
func insertRowDemo() {
sqlStr := "insert into info(name, age) values (?,?)"
ret, err := DB.Exec(sqlStr, "小王子", 19)
if err != nil {
fmt.Printf("insert failed, err:%v\n", err)
return
}
theID, err := ret.LastInsertId() // 新插入数据的id
if err != nil {
fmt.Printf("get lastinsert ID failed, err:%v\n", err)
return
}
fmt.Printf("insert success, the id is %d.\n", theID)
}
更新
// 更新数据
func updateRowDemo() {
sqlStr := "update info set age=? where id = ?"
ret, err := DB.Exec(sqlStr, 39, 6)
if err != nil {
fmt.Printf("update failed, err:%v\n", err)
return
}
n, err := ret.RowsAffected() // 操作影响的行数
if err != nil {
fmt.Printf("get RowsAffected failed, err:%v\n", err)
return
}
fmt.Printf("update success, affected rows:%d\n", n)
}
删除
// 删除数据
func deleteRowDemo() {
sqlStr := "delete from info where id = ?"
ret, err := DB.Exec(sqlStr, 1)
if err != nil {
fmt.Printf("delete failed, err:%v\n", err)
return
}
n, err := ret.RowsAffected() // 操作影响的行数
if err != nil {
fmt.Printf("get RowsAffected failed, err:%v\n", err)
return
}
fmt.Printf("delete success, affected rows:%d\n", n)
}

事务操作

对于事务操作,我们可以使用sqlx中提供的db.Beginx()tx.Exec()方法。示例代码如下:

//事务操作
func transDemo() {
tx, err := DB.Beginx() //开启事务
// tx.MustExec() //带Must的一般标识出错就直接panic
if err != nil {
if tx != nil {
tx.Rollback()
}
fmt.Printf("begin trans failed,err:%v\n", err)
return
}
sql1 := "update info set age=age-? where id=?"
tx.MustExec(sql1, 2, 1)
err = tx.Commit()
if err != nil {
tx.Rollback()
fmt.Printf("commit failed,err:%v\n", err)
}
fmt.Println("数据更新成功")
}

//事务操作2
func transDemo2() (err error) {
tx, err := DB.Beginx()
if err != nil {
fmt.Println("begin trans failed,err:", err)
return
}

defer func() {
if p := recover(); p != nil {
tx.Rollback()
panic(p)
} else if err != nil {
fmt.Println("rollback")
tx.Rollback()
} else {
err = tx.Commit()
fmt.Println("sql commit")
}
}()

sqlStr1 := "update info set age=99 where id = ?"
r, err := tx.Exec(sqlStr1, 1)
if err != nil {
fmt.Println("sqlstr1执行失败,err:", err)
return
}
n, err := r.RowsAffected()
if err != nil {
return
}
if n != 1 {
return errors.New("exec sqlStr1 failed")
}
return err
}

执行代码

func main() {
err := initDB()
if err != nil {
fmt.Printf("init DB failed,err:%v\n", err)
return
}
//查询单条
// queryDemo()
// queryMultiDemo()
// insertRowDemo()
// updateRowDemo()
// transDemo()
transDemo2()
}
 
posted @ 2022-05-08 22:46  wushaoyu  阅读(630)  评论(0编辑  收藏  举报