扫码订阅《 》或入驻星球,即可阅读文章!

GOLANG ROADMAP

阅读模式

  • 沉浸
  • 自动
  • 日常
首页
Go学习
  • Go学院

    • Go小课
    • Go视界
    • Go小考
    • Go实战
  • Go资源

    • 优质课程
    • 在线宝典
    • 资源下载
    • 帮找资源
训练营 🔥
  • Go体系课&实战训练营
  • 升值加薪陪跑训练营
Go求职
  • 求职刷题

    • 企业题库
    • 面试宝典
    • 求职面经
  • 求职服务

    • 内推互助
    • 求职助力
    • 内推公司
Go友会
  • 城市
  • 校园
推广返佣
  • 返佣排行
  • 返佣规则
  • 推广学院
实验区
  • Go周边
  • Go宝典

    • 推荐图书
    • 精品博文
  • Go开源

    • Go仓库
    • Go月刊
更多
  • 用户中心

    • 我的信息
    • 我的返佣
    • 我的消息
  • 玩转星球

    • 星球介绍
    • 星主权益
    • 吐槽专区
    • 成长记录
  • 合作交流

    • 商务合作
    • 讲师招募
    • 生态伙伴
author-avatar

GOLANG ROADMAP


首页
Go学习
  • Go学院

    • Go小课
    • Go视界
    • Go小考
    • Go实战
  • Go资源

    • 优质课程
    • 在线宝典
    • 资源下载
    • 帮找资源
训练营 🔥
  • Go体系课&实战训练营
  • 升值加薪陪跑训练营
Go求职
  • 求职刷题

    • 企业题库
    • 面试宝典
    • 求职面经
  • 求职服务

    • 内推互助
    • 求职助力
    • 内推公司
Go友会
  • 城市
  • 校园
推广返佣
  • 返佣排行
  • 返佣规则
  • 推广学院
实验区
  • Go周边
  • Go宝典

    • 推荐图书
    • 精品博文
  • Go开源

    • Go仓库
    • Go月刊
更多
  • 用户中心

    • 我的信息
    • 我的返佣
    • 我的消息
  • 玩转星球

    • 星球介绍
    • 星主权益
    • 吐槽专区
    • 成长记录
  • 合作交流

    • 商务合作
    • 讲师招募
    • 生态伙伴
  • Go语言Web编程

    • 课程介绍
  • Web基础

  • 表单

  • 访问数据库

    • 第1节:访问数据库
    • 第1节:database/sql 接口
    • 第3节:使用 MySQL 数据库
    • 第4节:使用 SQLite 数据库
    • 第5节:使用 PostgreSQL 数据库
    • 第6节:使用 Beego orm 库进行 ORM 开发
    • 第7节:NOSQL 数据库操作
    • 第8节:小结
  • session和数据存储

  • 文本处理

  • Web服务

  • 安全与加密

  • 国际化和本地化

  • 错误处理,调试和测试

  • 部署与维护

  • 如何设计一个Web框架

  • 扩展Web框架

扫码订阅《 》或入驻星球,即可阅读文章!

第3节:使用 MySQL 数据库


ASTA谢

目前 Internet 上流行的网站构架方式是 LAMP,其中的 M 即 MySQL, 作为数据库,MySQL 以免费、开源、使用方便为优势成为了很多 Web 开发的后端数据库存储引擎。

# MySQL驱动

Go 中支持 MySQL 的驱动目前比较多,有如下几种,有些是支持 database/sql 标准,而有些是采用了自己的实现接口, 常用的有如下几种:

  • https://github.com/go-sql-driver/mysql 支持 database/sql,全部采用 go写。
  • https://github.com/ziutek/mymysql 支持 database/sql,也支持自定义的接口,全部采用 go写。
  • https://github.com/Philio/GoMySQL 不支持 database/sql,自定义接口,全部采用 go 写。

接下来的例子我主要以第一个驱动为例(我目前项目中也是采用它来驱动),也推荐大家采用它,主要理由:

  • 这个驱动比较新,维护的比较好
  • 完全支持 database/sql 接口
  • 支持 keepalive,保持长连接,虽然 星星 (opens new window) fork 的 mymysql 也支持 keepalive,但不是线程安全的,这个从底层就支持了 keepalive。

# 示例代码

接下来的几个小节里面我们都将采用同一个数据库表结构:数据库 test,用户表 userinfo,关联用户信息表 userdetail。

CREATE TABLE `userinfo` (
	`uid` INT(10) NOT NULL AUTO_INCREMENT,
	`username` VARCHAR(64) NULL DEFAULT NULL,
	`department` VARCHAR(64) NULL DEFAULT NULL,
	`created` DATE NULL DEFAULT NULL,
	PRIMARY KEY (`uid`)
);

CREATE TABLE `userdetail` (
	`uid` INT(10) NOT NULL DEFAULT '0',
	`intro` TEXT NULL,
	`profile` TEXT NULL,
	PRIMARY KEY (`uid`)
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

如下示例将示范如何使用 database/sql 接口对数据库表进行增删改查操作

package main

import (
	"database/sql"
	"fmt"
	// "time"

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

func main() {
	db, err := sql.Open("mysql", "astaxie:astaxie@/test?charset=utf8")
	checkErr(err)

	// 插入数据
	stmt, err := db.Prepare("INSERT userinfo SET username=?,department=?,created=?")
	checkErr(err)

	res, err := stmt.Exec("astaxie", "研发部门", "2012-12-09")
	checkErr(err)

	id, err := res.LastInsertId()
	checkErr(err)

	fmt.Println(id)
	// 更新数据
	stmt, err = db.Prepare("update userinfo set username=? where uid=?")
	checkErr(err)

	res, err = stmt.Exec("astaxieupdate", id)
	checkErr(err)

	affect, err := res.RowsAffected()
	checkErr(err)

	fmt.Println(affect)

	// 查询数据
	rows, err := db.Query("SELECT * FROM userinfo")
	checkErr(err)

	for rows.Next() {
		var uid int
		var username string
		var department string
		var created string
		err = rows.Scan(&uid, &username, &department, &created)
		checkErr(err)
		fmt.Println(uid)
		fmt.Println(username)
		fmt.Println(department)
		fmt.Println(created)
	}

	// 删除数据
	stmt, err = db.Prepare("delete from userinfo where uid=?")
	checkErr(err)

	res, err = stmt.Exec(id)
	checkErr(err)

	affect, err = res.RowsAffected()
	checkErr(err)

	fmt.Println(affect)

	db.Close()

}

func checkErr(err error) {
	if err != nil {
		panic(err)
	}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

通过上面的代码我们可以看出,Go 操作 Mysql 数据库是很方便的。

关键的几个函数我解释一下:

sql.Open() 函数用来打开一个注册过的数据库驱动,go-sql-driver 中注册了 mysql 这个数据库驱动,第二个参数是 DSN(Data Source Name),它是 go-sql-driver 定义的一些数据库链接和配置信息。它支持如下格式:

user@unix(/path/to/socket)/dbname?charset=utf8
user:password@tcp(localhost:5555)/dbname?charset=utf8
user:password@/dbname
user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname

db.Prepare() 函数用来返回准备要执行的 sql 操作,然后返回准备完毕的执行状态。

db.Query() 函数用来直接执行 Sql 返回 Rows 结果。

stmt.Exec() 函数用来执行 stmt 准备好的SQL语句

我们可以看到我们传入的参数都是 =? 对应的数据,这样做的方式可以一定程度上防止 SQL 注入。

  • MySQL驱动
  • 示例代码