对许多 Web 应用程序而言,数据库都是其核心所在。数据库几乎可以用来存储想查询和修改的任何信息,比如用户信息、产品目录或者新闻列表等。
数据库是Web编程不可或缺的主题。这里我们就来看一下如何用 Go 语言操作不同的数据库。
database/sql 接口
Go 语言不同于 PHP,它没有官方提供任何数据库驱动,而是为开发者定义了一组标准接口。提供数据库服务的开发者,可以实现这组接口,以为特定的数据提供驱动。而数据库的使用者,也可以通过这组接口方便地访问数据库,甚至在适当的时候,以非常小的代价迁移数据库。
通常我们在以类似如下的方式导入数据库驱动模块时:
上面的 import
语句中的下划线表示,我们要导入这个模块,但不会直接使用其中的符号。但导入的时候,会执行模块的初始化代码,也就是其中定义的 init()
函数,在这个函数中数据库驱动会自动将其自身注册进 Go 的 database/sql
框架中,后面我们就可以方便地通过这个接口来访问对应得数据了。
关于这组接口的详细内容,可以参考官方文档。
MySQL
目前网上流行的网站架构方式是 LAMP,其中的 M 即为 MySQL。作为数据库,MySQL 以免费、开源、使用方便为优势而成为了许多Web开发的后端数据库存储引擎。
MySQL 安装
首先我们需要安装 MySQL,这可以通过如下的命令来完成:
安装之后,通过如下命令可以查看 MySQL 服务器占用的端口:
可以看到 MySQL 服务器在 TCP 的 3306 端口监听请求。
新MySQL建用户
安装好了 MySQL 之后,我们还需要创建用户,以便于后面在代码里使用。创建用户的方法如下:
这样就创建了一个名为 hanpfei
,密码为 hanpfei
的用户。
然后登录一下。
创建数据库并为用户授权
登录MYSQL(有ROOT权限)。我里我以 ROOT 身份登录.
为用户创建一个数据库 (staff_info_db
)
授权 hanpfei
用户拥有 staff_info_db
数据库的所有权限。
刷新系统权限表
创建表
有了数据库,接下来就是创建表了。建表语句如下:
具体的建表可以通过如下得命令来完成:
这样我们需要的表就建好了。
用 Go 语言访问 MySQL
安装好了数据库,并创建了适当的用户、数据库以及数据库表之后,我们就可以开始用 Go 语言访问 MySQL了。然而,在实际写代码之前,还要先下载对应的驱动。Go 语言中支持 MySQL 的驱动目前比较多,我们以支持 Go 语言标准 database/sql
接口的 github.com/Go-SQL-Driver/MySQL
为例来看。我们先要下载这个包:
然后来看如何使用 database/sql
接口对数据库表进行增删改查操作:
通过以上代码,可以看出来 Go 语言操作 MySQL 数据库还是非常方便的。关于这个数据库驱动的用法更详细的信息,可以参考其 官方文档。
SQLite3
SQLite 是一个开源的嵌入式系统的关系型数据库,它是实现自包容、零配置且支持事务的 SQL 数据库引擎。其特点是高度便携、结构紧凑、高效且可靠。与其它许多数据库相比,SQLite 的安装运行都非常简单。大多数情况下,只要确保 SQLite 的二进制文件存在,即可创建和访问数据库。
可以通过如下的命令来安装 SQLite:
SQLite 的命令行工具可装可不装,不影响我们通过代码操作 SQLite 数据库。
同样我们需要选择一款 SQLite 驱动。Go 语言支持 SQLite 的驱动也比较多,但好多都不支持 database/sql
接口。这里我们选择支持 database/sql
接口的 github.com/mattn/go-sqlite3
。
在开始写代码前,要先安装这个驱动:
建表的语句如下:
不过我们同样通过代码来完成建表了。然后来看在 Go 语言中,具体如何操作 SQLite :
执行上面的代码,将看到如下的输出:
我们可以看到,上面操作 SQLite 数据库的代码,和前面操作 MySQL 数据库的代码几乎一模一样。仅有的改变是导入的驱动变了,然后调用 sql,Open()
打开数据库驱动的方式不同。
PostgreSQL
PostgreSQL 是一个开源的自由的对象-关系数据库服务器,它以灵活的 BSD-Style 许可发行。相对于其它许多的开源数据库系统(如 MySQL 和 Firebird)和商业数据库系统(如 Oracle 和 MS SQL Server),它为我们提供了另外的一种选择。
PostgreSQL 相对于 MySQL 而言更加庞大,因为它本是为替代 Oracle 而设计。
这里我们就来看一下如何用 Go 语言操作 PostgreSQL。
安装
我们首先要安装 PostgreSQL 服务器。使用如下命令,会自动安装最新版,这里为 9.5
:
安装完成后,默认会:
(1)创建名为 “postgres” 的Linux用户
(2)创建名为 “postgres”、不带密码的默认数据库账号作为数据库管理员
(3)创建名为 “postgres” 的表
安装完成后的一些默认信息如下:
通过 lsof -i
命令我们可以查看 PostgreSQL 服务器占用的端口,并确认其在正常运行:
可以看到 PostgreSQL 服务器在 TCP 的 5432 端口上监听请求,并开启了多个进程来监听。
配置
安装完后会有 PostgreSQL 的客户端 psql 可以用,通过 sudo -u postgres psql
进入,提示符变成 postgres=#
:
在这里可以执行 SQL 语句和 psql 的基本命令。
新建 PostgreSQL用户
我们可以通过如下的命令
通过 \du
可以查看当前已经存在的用户列表:
|
|
此时我们以新创建的用户登录PostgreSQL,会报出如下得error:
我们可以通过修改 pg_hba.conf
文件来解决这个问题:
将其中 除 postgres
用户外 的所有用户的 METHOD
都从 peer
或 ident
改为 md5
或 trust
。
修改完毕,保存退出。
然后执行如下命令重新加载配置:
再次尝试用新创建的用户的登录 PostgreSQL 时报出了新的 error:
提示用户的数据库不存在。我们还需要再次登录 postgres
用户,为我们的新用户创建数据库:
然后就可以以新用户登录了:
这里我们需要输入两次密码,一次是当前 Linux 用户的用户密码,用来执行 sudo,另一次是数据库的用户的密码,用来登录数据库。
接着我们创建一个新的应用数据库,并选择它作为我们当前使用的数据库,这可以通过 \c
命令来实现:
上面的 \l
是用来列出当前已创建的所有数据库的。注意我们切换了数据库之后,命令输入提示字符串也变为了新数据库的名字。
然后创建表。建表语句如下:
|
|
具体命令则是:
权限
创建的表还可以赋予其它用户完全的权限,比如,以 postgres
用户创建的表的完全的权限赋予新用户:
使用 Go 语言操作 PostgreSQL
同样我们需要先找个驱动。Go 语言的 PostgreSQL 驱动也很多。这里我们选用支持 database/sql
接口的驱动 github.com/lib/pq
,这个项目由 github.com/bmizerany/pq
迁移而来,而后者目前已经废弃。我们还是要先安装:
然后用 Go 语言访问 PostgreSQL:
从上面的代码中可以看到,PostgreSQL 是通过 “$1,$2”这种方式来占位要传入的参数的,而不是 MySQL 中的 “?” 另外在 sql.Open()
中的 dsn 信息的格式也与 MySQL 不同,因而在使用时需要注意。
此外, PostgreSQL 不支持 LastInsertId()
函数,因为它内部没有实现类似 MySQL 的自增 ID 返回。其它的代码则几乎一模一样。
NoSQL 数据库
NoSQL (Not only SQL),指的是非关系型数据库。随着 Web 2.0 的兴起,传统的关系型数据库在应付新应用,特别是超大规模和高并发得 SNS 型 Web 2.0 纯动态网站时已经显得力不从心,暴露了很多难以客服得问题,而非关系型数据库则由于其自身的有点,而得到迅速得发展。
在看了上面的几种 SQL 数据库之后,接下来我们将学习用 Go 语言操作几种 NoSQL 数据库,主要是 Redis 和 MongoDB。
Redis
Redis 是一个开源的(BSD 许可),基于内存的数据结构存储产品,它可以被用作数据库,缓存和消息代理。它支持的数据结构非常多,如 string(字符串),hash(哈希),list(列表),set(集合),带有范围查询的sorted set(有序集合),bitmap(位图),超文本和具有半径查询的地理空间索引。Redis具有内置复制,Lua脚本,LRU驱逐,事务和不同级别的磁盘持久性,并通过Redis Sentinel提供高可用性,并通过Redis Cluster进行自动分区。
Redis 是一个超高性能的 key-value 数据库。Redis 的出现,很大程度补偿了memcached 这类 key-value 存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。
这里我们就来看一下如何用 Go 语言操作Redis。
Redis 安装
使用如下命令,会自动安装最新版
通过 lsof -i
命令我们可以查看 Redis 服务器占用的端口。
可以看到 Redis 服务器在 TCP 的 6379 端口监听请求。
Redis 还提供了功能强大的命令行工具
Go 程序访问 Redis
Go 语言的 Redis 客户端驱动还是很多的,具体可以通过 Redis 的 Client 页 找到它们。当前还处于比较活跃的状态,也就是近 6 个月官方 repo 有过更新的驱动如下:
其中最后两个,是目前 Redis 官方推荐使用的 Go 驱动。这里我们以最后一个为例,来看要如何在 Go 代码里操作 Redis。然而,在开始之前,我们还是要先安装相应的包:
接着来看具体如何通过 Go 语言访问 Redis:
运行上面代码,可以看到如下的输出:
我们可以看到,操作 Redis 非常方便,大多只要用 client
命令即可。关于 Radix
用法的更多详细内容,可以参考其 官方文档。
MongoDB
MongoDB 是一个高性能功能强大而流行的分布式文档存储 NoSQL (Not Only SQL) 数据库产品。它是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
下面我们来看一下如何通过 Go 语言操作 MongoDB。
MongoDB 安装
首先需要安装 MongoDB。使用如下命令,会自动安装最新版 MongoDB,这里是 2.6.10
版。
通过 lsof -i
命令我们可以查看 MongoDB 服务器占用的端口,并确认 MongoDB 服务器的正常运行。
可以看到 MongoDB 服务器在 TCP 的 27017 端口监听请求。
创建数据库
安装了 MongoDB 服务器之后,我们还要创建数据库,以备后面在代码里面用。我们可以通过 MongoDB 的 shell 版本,使用 use
命令创建数据库:
use
命令在 MySQL 中用于选择已经创建好的数据库,而在 MongoDB 中则会自动创建当前还不存在的数据库。
Go 程序访问 MongoDB
在开始编写 Go 代码访问 MongoDB 数据库之前,我们还要先下载 MongoDB 的Go语言驱动。在 MongoDB 的 官方 Drivers主页 可以找到可用的 Go 语言驱动。当前官方推荐的只有开源社区支持的 mgo
驱动。mgo 主页。mgo 的 GitHub 主页。通过 go get
命令安装我们需要的两个 mgo Go 包:
接着来看具体如何通过 Go 语言操作 MongoDB。
操作与许多 SQL数据库的 ORM 库提供的很相似,可以直接操作对象。