Golang处理MySQL框架zdpgo_sqlx快速入门教程

准备SQL

sql 复制代码
drop table if exists user;
create table user
(
    id   int primary key auto_increment,
    name varchar(36),
    age  int
) engine = innodb
  character set utf8mb4;

insert into user(name, age)
values ('张三', 23),
       ('张三2', 23),
       ('张三3', 23);

基本增删改查

go 复制代码
package main

import (
	"fmt"
	_ "zdpgo_mysqldriver"
	"zdpgo_sqlx"
)

var (
	db  *zdpgo_sqlx.DB
	err error
)

type user struct {
	Id   int    `db:"id"`
	Age  int    `db:"age"`
	Name string `db:"name"`
}

func main() {
	// 连接
	dsn := "root:zhangdapeng520@tcp(192.168.234.130:3306)/test"
	db, err = zdpgo_sqlx.Open("mysql", dsn)
	if err != nil {
		fmt.Printf("connect server failed, err:%v\n", err)
		return
	}
	db.SetMaxOpenConns(200)
	db.SetMaxIdleConns(10)

	// 新增
	sqlStr := "INSERT INTO user(name, age) VALUES(?, ?)"
	result, err := db.Exec(sqlStr, "张三", 22)
	if err != nil {
		fmt.Printf("exec failed, err:%v\n", err)
		return
	}
	insertID, err := result.LastInsertId()
	if err != nil {
		fmt.Printf("get insert id failed, err:%v\n", err)
		return
	}
	fmt.Printf("insert data success, id:%d\n", insertID)

	// 查询单个
	sqlStr = "SELECT id, name, age FROM user WHERE id = ?"
	var u user
	if err := db.Get(&u, sqlStr, 1); err != nil {
		fmt.Printf("get data failed, err:%v\n", err)
		return
	}
	fmt.Printf("id:%d, name:%s, age:%d\n", u.Id, u.Name, u.Age)

	// 查询多个
	sqlStr = "SELECT id, name, age FROM user WHERE id > ?"
	var users []user
	if err := db.Select(&users, sqlStr, 0); err != nil {
		fmt.Printf("get data failed, err:%v\n", err)
		return
	}
	for i := 0; i < len(users); i++ {
		fmt.Printf("id:%d, name:%s, age:%d\n", users[i].Id, users[i].Name, users[i].Age)
	}

	// 更新
	sqlStr = "UPDATE user SET age = ? WHERE id = ?"
	result, err = db.Exec(sqlStr, 22, 1)
	if err != nil {
		fmt.Printf("exec failed, err:%v\n", err)
		return
	}
	affectedRows, err := result.RowsAffected()
	if err != nil {
		fmt.Printf("get affected failed, err:%v\n", err)
		return
	}
	fmt.Printf("update data success, affected rows:%d\n", affectedRows)

	// 删除
	sqlStr = "DELETE FROM user WHERE id = ?"
	result, err = db.Exec(sqlStr, 1)
	if err != nil {
		fmt.Printf("exec failed, err:%v\n", err)
		return
	}
	affectedRows, err = result.RowsAffected()
	if err != nil {
		fmt.Printf("get affected failed, err:%v\n", err)
		return
	}
	fmt.Printf("delete data success, affected rows:%d\n", affectedRows)
}

NamedQuery

go 复制代码
package main

import (
	"fmt"
	_ "zdpgo_mysqldriver"
	"zdpgo_sqlx"
)

var (
	db  *zdpgo_sqlx.DB
	err error
)

type user struct {
	Id   int    `db:"id"`
	Age  int    `db:"age"`
	Name string `db:"name"`
}

func main() {
	// 连接
	dsn := "root:zhangdapeng520@tcp(192.168.234.130:3306)/test"
	db, err = zdpgo_sqlx.Open("mysql", dsn)
	if err != nil {
		fmt.Printf("connect server failed, err:%v\n", err)
		return
	}
	db.SetMaxOpenConns(200)
	db.SetMaxIdleConns(10)

	sqlStr := "SELECT id, name, age FROM user WHERE age = :age"
	rows, err := db.NamedQuery(sqlStr, map[string]interface{}{
		"age": 23,
	})
	if err != nil {
		fmt.Printf("named query failed failed, err:%v\n", err)
		return
	}
	defer rows.Close()
	for rows.Next() {
		var u user
		if err := rows.StructScan(&u); err != nil {
			fmt.Printf("struct sacn failed, err:%v\n", err)
			continue
		}
		fmt.Printf("%#v\n", u)
	}
}

NamedExec

go 复制代码
package main

import (
	"fmt"
	_ "zdpgo_mysqldriver"
	"zdpgo_sqlx"
)

var (
	db  *zdpgo_sqlx.DB
	err error
)

type user struct {
	Id   int    `db:"id"`
	Age  int    `db:"age"`
	Name string `db:"name"`
}

func main() {
	// 连接
	dsn := "root:zhangdapeng520@tcp(192.168.234.130:3306)/test"
	db, err = zdpgo_sqlx.Open("mysql", dsn)
	if err != nil {
		fmt.Printf("connect server failed, err:%v\n", err)
		return
	}
	db.SetMaxOpenConns(200)
	db.SetMaxIdleConns(10)

	sqlStr := "INSERT INTO user(name, age) VALUES(:name, :age)"
	result, err := db.NamedExec(sqlStr, map[string]interface{}{
		"name": "里斯",
		"age":  18,
	})
	if err != nil {
		fmt.Printf("named exec failed, err:%v\n", err)
		return
	}
	insertId, err := result.LastInsertId()
	if err != nil {
		fmt.Printf("get last insert id failed, err:%v\n", err)
		return
	}
	fmt.Printf("insert data success, id:%d\n", insertId)

	sqlStr = "SELECT id, name, age FROM user WHERE age = :age"
	rows, err := db.NamedQuery(sqlStr, map[string]interface{}{
		"age": 18,
	})
	if err != nil {
		fmt.Printf("named query failed failed, err:%v\n", err)
		return
	}
	defer rows.Close()
	for rows.Next() {
		var u user
		if err := rows.StructScan(&u); err != nil {
			fmt.Printf("struct sacn failed, err:%v\n", err)
			continue
		}
		fmt.Printf("%#v\n", u)
	}
}

事务处理

go 复制代码
package main

import (
	"fmt"
	_ "zdpgo_mysqldriver"
	"zdpgo_sqlx"
)

var (
	db  *zdpgo_sqlx.DB
	err error
)

type user struct {
	Id   int    `db:"id"`
	Age  int    `db:"age"`
	Name string `db:"name"`
}

func main() {
	// 连接
	dsn := "root:zhangdapeng520@tcp(192.168.234.130:3306)/test"
	db, err = zdpgo_sqlx.Open("mysql", dsn)
	if err != nil {
		fmt.Printf("connect server failed, err:%v\n", err)
		return
	}
	db.SetMaxOpenConns(200)
	db.SetMaxIdleConns(10)

	tx, err := db.Begin()
	if err != nil {
		fmt.Printf("transaction begin failed, err:%v\n", err)
		return
	}

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

	sqlStr1 := "UPDATE user SET age = ? WHERE id = ? "
	reuslt1, err := tx.Exec(sqlStr1, 18, 1)
	if err != nil {
		fmt.Printf("sql exec failed, err:%v\n", err)
		return
	}
	rows1, err := reuslt1.RowsAffected()
	if err != nil {
		fmt.Printf("affected rows is 0")
		return
	}
	sqlStr2 := "UPDATE user SET age = ? WHERE id = ? "
	reuslt2, err := tx.Exec(sqlStr2, 19, 5)
	if err != nil {
		fmt.Printf("sql exec failed, err:%v\n", err)
		return
	}
	rows2, err := reuslt2.RowsAffected()
	if err != nil {
		fmt.Printf("affected rows is 0\n")
		return
	}

	if rows1 > 0 && rows2 > 0 {
		fmt.Printf("update data success\n")
	}
	return
}

批量添加

go 复制代码
package main

import (
	"fmt"
	_ "zdpgo_mysqldriver"
	"zdpgo_sqlx"
)

var (
	db  *zdpgo_sqlx.DB
	err error
)

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

type AddUser struct {
	Age  int    `db:"age"`
	Name string `db:"name"`
}

func main() {
	// 连接
	dsn := "root:zhangdapeng520@tcp(192.168.234.130:3306)/test"
	db, err = zdpgo_sqlx.Open("mysql", dsn)
	if err != nil {
		fmt.Printf("connect server failed, err:%v\n", err)
		return
	}
	db.SetMaxOpenConns(200)
	db.SetMaxIdleConns(10)

	// 准备数据
	u1 := AddUser{Name: "李四1", Age: 18}
	u2 := AddUser{Name: "李四2", Age: 28}
	u3 := AddUser{Name: "李四3", Age: 38}
	users := []interface{}{u1, u2, u3}

	_, err = db.NamedExec("INSERT INTO user (name, age) VALUES (:name, :age)", users)
	fmt.Println(err)
	return
}
···

## in 查询
```go
package main

import (
	"fmt"
	_ "zdpgo_mysqldriver"
	"zdpgo_sqlx"
)

var (
	db  *zdpgo_sqlx.DB
	err error
)

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

type AddUser struct {
	Age  int    `db:"age"`
	Name string `db:"name"`
}

func main() {
	// 连接
	dsn := "root:zhangdapeng520@tcp(192.168.234.130:3306)/test"
	db, err = zdpgo_sqlx.Open("mysql", dsn)
	if err != nil {
		fmt.Printf("connect server failed, err:%v\n", err)
		return
	}
	db.SetMaxOpenConns(200)
	db.SetMaxIdleConns(10)

	// 动态填充id
	ids := []int{1, 2, 3}
	query, args, err := zdpgo_sqlx.In("SELECT name, age FROM user WHERE id IN (?)", ids)
	if err != nil {
		panic(err)
	}

	// sqlx.In 返回带 `?` bindvar的查询语句, 我们使用Rebind()重新绑定。
	// 重新生成对应数据库的查询语句(如PostgreSQL 用 `$1`, `$2` bindvar)
	query = db.Rebind(query)
	var users []User
	err = db.Select(&users, query, args...)
	if err != nil {
		panic(err)
	}
	for _, user := range users {
		fmt.Printf("user:%#v\n", user)
	}
}
相关推荐
IT_陈寒10 分钟前
闭包陷阱让我加了两天班,JavaScript你真行
前端·人工智能·后端
北冥you鱼30 分钟前
abigen 最佳实践:从入门到精通,高效生成 Go 语言合约绑定
开发语言·golang·区块链
易协同低代码1 小时前
通达OA核心类库TD类深度解析
后端
Gopher_HBo1 小时前
Go语言学习笔记(十八)Gin处理Session
后端
谭光志2 小时前
工具塞满上下文窗口怎么办?深度拆解 AI Agent Tool Search 按需加载实现原理
前端·后端·ai编程
她说..2 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
foggyprojects2 小时前
从0开始,一句话启动AI DataAgent
后端·数据分析·ai编程
郡杰2 小时前
一些基础和问题解决
后端
陈随易3 小时前
前端项目部署只要30秒
前端·后端·程序员
YIAN3 小时前
从零手写文件读取 MCP 服务:一文吃透 Model Context Protocol 全链路通信原理
前端·后端·mcp