Go 学习小册:go.jun.one
Github
  • 首页
  • Go 面试题
    • Untitled
    • 数组与切片有什么异同
    • 41-50
    • 4-5月
    • Go 进阶实战 100 题
    • Go 并发编程
  • 跟着例子学习Go
    • 基础部分
      • 12. 函数
      • 13. 多返回值函数
      • 14.可变参函数
      • 15. 闭包
  • 我的社区贡献和开源项目
  • Struct 结构体
    • 自定义类型
    • 结构体
    • 匿名结构体
    • 接口 interface
  • gin
    • Gin 项目初始化
  • 并发
    • 并发安全和锁
    • 一文搞定 Go 并发的实现原理:goroutine
  • 常用代码块
    • gerr
  • Go Web 开发进阶
    • MySQL 的连接和初始化
    • MySQL Register 源码解读
    • Go 原生操作 MySQL CRUD
  • go-redis的基本使用
由 GitBook 提供支持
在本页
  • 单行查询
  • 多行查询
  • 插入数据
  • 更新数据
  • 删除数据

这有帮助吗?

在GitHub上编辑
  1. Go Web 开发进阶

Go 原生操作 MySQL CRUD

Go 原生操作 MySQL

上一页MySQL Register 源码解读下一页go-redis的基本使用

最后更新于3年前

这有帮助吗?

先输入以下命令,在 MySQL 中建立一张表。

CREATE TABLE `user` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(20) DEFAULT '',
    `age` INT(11) DEFAULT '0',
    PRIMARY KEY(`id`)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

然后可以查询到 该表;

show tables;

插入两条数据:

insert into user (name, age) values("bingo", 22)
insert into user (name, age) values("violette", 23)

查询可得到这些数据:

select * from user;

单行查询

func (db *DB) QueryRow(query string, args ...interface{}) *Row go
// queryRow 查询单条数据
func queryRow() {
	sqlStr := "select id, name, age from user where id =?"
	var u user
	// 非常重要:确保 QueryRow 之后调用 Scan 方法,否则持有的数据库连接不会被释放
	err := db.QueryRow(sqlStr, 1).Scan(&u.id, &u.name, &u.age) // 1 代表获取第一条
	if err != nil {
		fmt.Printf("scan failed, err:%v\n", err)
		return
	}
	fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
}

多行查询

// queryMultiRows 查询多条数据
func queryMultiRows() {
	sqlStr := "select id, name, age from user where id > ?"
	rows, err := db.Query(sqlStr, 0)
	if err != nil {
		fmt.Printf("query failed, err: %v\n", err)
		return
	}
	// 非常重要:关闭rows,释放持有的数据库连接
	defer rows.Close()

	// 循环读取结果集中的数据
	for rows.Next() {
		var u user
		err := rows.Scan(&u.id, &u.name, &u.age)
		if err != nil {
			fmt.Printf("scan failed, err:%v\n", err)
			return
		}
		fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
	}
}

插入数据

插入、更新、删除操作都使用 Exec 方法。

func (db *DB) Exec(query string, args ...interface{}) (Result, error)
// insertRow 插入数据
func insertRow() {
	sqlStr := "insert into user(name, age) values (?,?)"
	re, err := db.Exec(sqlStr, "jun", 22)
	if err != nil {
		fmt.Printf("insert failed, err:%v\n", err)
		return
	}
	var newID int64
	newID, err = re.LastInsertId() // 新插入数据的ID
	if err != nil {
		fmt.Printf("get newID failed, err:%v\n", err)
		return
	} else {
		fmt.Printf("insert success, the id is %d.\n", newID)
	}
}

更新数据

// 更新数据
func updateRow() {
	sqlStr := "update user set age=? where id = ?"
	re, err := db.Exec(sqlStr, 39, 3)
	if err != nil {
		fmt.Printf("update failed, err:%v\n", err)
		return
	}
	var n int64
	n, err = re.RowsAffected() // 操作影响的行数
	if err != nil {
		fmt.Printf("`get RowsAffected failed, err:%v\n", err)
		return
	}
	fmt.Printf("update success, affected rows: %d\n", n)
}

删除数据

// deleteRow 删除数据
func deleteRow() {
	sqlStr := "delete from user where id = ?"
	re, err := db.Exec(sqlStr, 2)
	if err != nil {
		fmt.Printf("delete failed, err:%v\n", err)
		return
	}
	var n int64
	n, err = re.RowsAffected() // 操作影响的行数
	if err != nil {
		fmt.Printf("`get RowsAffected failed, err:%v\n", err)
		return
	}
	fmt.Printf("delete success, affected rows: %d\n", n)
}

查询结果:

查询结果:

插入结果:

更新数据的结果:

删除数据的结果:

参考文档:

https://www.liwenzhou.com/posts/Go/go_mysql/