Gin 系列教程 (02)-使用MySQL数据库

一般来说,一个web应用肯定是离不开数据库的。通过对数据库的增删改查,足以胜任相当一部分应用场景了。
这里会介绍最基本的连接数据库和几个增删改查的例子。

驱动

mysql的驱动我使用github.com/go-sql-driver/mysql

1
$ go get -u github.com/go-sql-driver/mysql
1
2
3
4
import "database/sql"
import _ "github.com/go-sql-driver/mysql"
db, err := sql.Open("mysql", "user:password@/dbname")

参数

初始化链接参数的时候,除了dbname,其他参数都是选填的,比如数据库没有密码,就可以不填。
比如最短的情况下可以是

1
/dbname

如果你不想预先选择数据库,甚至可以:

1
/

密码

密码支持任何字符,所以也不需要转义

协议

一般情况下可以选择unix 套接字或者是tcp。

地址

对于tcp和udp连接类型,使用host[: port]这种格式,如果不填port,则会使用默认端口3306,如果host是ipv6类型,必须用方括号括起来,函数net.JoinHostPort和net.SplitHostPort以这种形式处理地址。

对于Unix 套接字,地址是MySQL服务器套接字的绝对路径,例如/var/run/mysqld/mysqld.sock或/tmp/mysql.sock。

参数

参数是区分大小写的!
这部分内容比较多,且不常用,本篇文章的重点不在于介绍这个mysql库,所以就不再赘述。

用法

这里简单介绍一下增删改查等常见用法。
首先,假设我们有一个数据库,test01,有一张数据表 user。

表结构:

1
2
3
4
5
create table user (
id INT(10) NOT NULL AUTO_INCREMENT,
username varchar(10) not null,
pw varchar(20) not null
);

增删改查例子

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
package main
import "database/sql"
import _ "github.com/go-sql-driver/mysql"
func main() {
db, err := sql.Open("mysql", "user:password@/dbname")
if err != nil {
panic(err.Error())
}
defer db.Close()
// 打开关闭的链接,验证配置
err = db.Ping()
if err != nil {
panic(err.Error()) //进行错误处理
}
// 插入数据
stmtIns, err := db.Prepare("insert into user values( ?, ? )")
if err != nil {
panic(err.Error())
}
defer stmtIns.Close()
//查询数据
stmtOut, err := db.Prepare("select username from user where id = ?")
if err != nil {
panic(err.Error())
}
defer stmtOut.Close()
// 插入0-24个数字作为id到user表里。
for i := 0; i < 25; i++ {
_, err = stmtIns.Exec(i, 'testname')
if err != nil {
panic(err.Error())
}
}
var username string
// 查询id是13的username
err = stmtOut.QueryRow(13).Scan(&username)
if err != nil {
panic(err.Error())
}
fmt.Printf("The username is: %s", username)
// 删除数据
stmtDel, err = db.Prepare("delete from user where id = ?")
if err != nil {
panic(err.Error())
}
defer stmtDel.Close()
res, err = stmtDel.Exec(12)
if err != nil {
panic(err.Error())
}
affect, err = res.RowsAffected()
if err != nil {
panic(err.Error())
}
fmt.Println(affect)
}

这样就完成了几个最基本的增删改查的操作。非常的简单。
Prepare函数是不直接执行的,要等到调用Exec()函数才会真正执行操作。
下一篇会介绍基本的redis操作。

坚持原创技术分享,您的支持将鼓励我继续创作!