学习目标

  • 掌握Go 操作MySQL数据库方法
  • 掌握gorm操作MySQL以及gin+gorm项目案例应用
  • 掌握Redis基本命令以及Go如何操作Redis

提示:MySQL和Redis在Go Web项目中应用广泛(MySQL: 存储基本数据;Redis 存储缓冲数据,两者一般都是配合运用)

大家学习有问题,请及时留言,并可以加入交流群学习。

Go 操作 MySQL 数据库

1. 背景

在实际开发中,要用到数据库存储数据。MySQL是一个关系型数据库管理系统 使用非常广泛。在Go语言开发中,会选择一个操作数据的类库来帮助我们完成工作。

2. 简单介绍

2.1 MySQL 数据库介绍

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

2.2 MySQL 安装

关于MySQL安装这里不做更多的讲解,自行通过上网资料进行安装。

2.3 Go 语言标准库中的 database/sql 包介绍

database/sql 包提供了一个围绕sql(或类似sql)数据库的通用接口

3. 操作 MySQL 数据库的准备工作

3.1 加载驱动
 

操作mysql需要 mysql 的驱动,由于我使用 go mod 来管理依赖,直接导入包就行。


import ( _ "github.com/go-sql-driver/mysql" )


3.2 导入包
 

方法同上,导入包即可。


import "database/sql"


3.3 打开数据库

调用 sql.Open 方法打开数据库

db, err := sql.Open("mysql", dataSourceName) defer db.Close() if err != nil { return }

在执行了Open 后,并没有立即建立数据库连接。直到你发起数据库请求后才真正建立连接。 你可以使用 Ping 来验证连接是否通畅。

3.4 验证连接是否通畅


if err := db.Ping(); err != nil { log.Fatal(err) } else { fmt.Println("连接成功") }


操作mysql需要 mysql 的驱动,由于我使用 go mod 来管理依赖,直接导入包就行。

4. 一些基本操作

4.1 创建数据库和表结构

  • 创建数据库

mysql> create database ginsql;

  • 创建数据表
CREATE TABLE IF NOT EXISTS `person`(
   `id` INT AUTO_INCREMENT,
   `name` VARCHAR(20),
   `age` int,
   PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

4.2 增(插入数据)

使用 db.Exec 方法插入数据
//增(插入数据)
db.Exec("INSERT INTO person(name,age) VALUES(?,?);", "zhangsan", 20)
db.Exec("INSERT INTO person(name,age) VALUES(?,?);", "lisi", 40)
db.Exec("INSERT INTO person(name,age) VALUES(?,?);", "wangwu", 30)
fmt.Println("插入成功")

4.3 查询

使用 db.Query 方法 执行查询SQL,rows.Next 方法遍历结果集,rows.Scan 读取数据到指定的变量中。

//查询数据库
    rows, err := db.Query("select name,age  from person ")
    if err != nil {
        log.Fatal(err)
    }
    for rows.Next() {
        var name, age string
        rows.Scan(&name, &age)
        fmt.Println("name=", name, "age=", age)
    }

4.4 改 (更新)

使用 db.Exec 执行 SQL 预计,执行后同构 result3.RowsAffected() 获得 影响行数。

// 更新 (update)
    //update person set age = 50 where name = 'zhangsan'
    result3, err2 := db.Exec("update person set  age = ?  where name = ?", 100, "zhangsan")
    if err != nil {
        fmt.Println("ERROR:", err2)
        log.Fatal(err)
    }
    if result3 != nil {
        //插入数据后的主键id
        lastInsertID, _ := result3.LastInsertId()
        //影响行数
        rowsaffected, _ := result3.RowsAffected()
        fmt.Println("#UPDATE lastInsertID=", lastInsertID, "RowsAffected=", rowsaffected)
    }

4.5 删 (删除数据)

使用 db.Exec 执行删除SQL语句,判断 result.RowsAffected() 影响行数。

//删 (删除数据)
    _, err3 := db.Exec("delete from person where name=?", "lisi")
    if err3 != nil {
        fmt.Println("ERROR:", err3)
        log.Fatal(err)
    }