Go官方并不提供数据库驱动,而只是为开发数据库驱动定义了一些标准接口。我们要使用mysql数据库得使用第三方维护的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,保持长连接
有了驱动,其实golang使用mysql和其他语言没有太大的区别,虽然具体的方法调用与类组织不太一样。
准备
使用10.4.16.95上的mariadb数据库,新建一个golang的数据库,添加两张测试用的表。
create database golang; |
先ssh登录服务器(因为安全考虑,不开放mysql的root用户的远程登录权限),用root用户本地登录mysql新建一个用于测试的可远程登录的用户:
ssh wuxu@10.4.16.95 |
这样就可以用golang登录新建的数据库了
Golang操作mysql
先get数据库驱动,在命令行运行go get github.com/go-sql-driver/MySQL
,会自动使用git从github下载mysql驱动工程到$GOPATH/src/
。
基本的插入,更新,删除,查找方法如下:
import ( |
与以往的mysql操作相似,也是一个连接对象,对于插入,删除等要先prepare,然后执行Exec,在exec阶段绑定占位符变量。
比较独特的是Exec返回的Result指针,它包含LastInsertId和 RowsAffedted 两个方法。
注意数据连接的dsn(data source name)和php或者其他语言的比较不一样。我们使用的是 user:password@protocol(host:port)/dbname?charset=utf8
的形式。驱动本身支持更多形式的dsn:
- user@Unix(/path/to/socket)/dbname?charset=utf8
- user:password@tcp(localhost:5555)/dbname?charset=utf8
- user:password@/dbname
- user:password@tcp([::]:80)/dbname // ipv6
整个数据库操作的流程大概如下:
sql.Open()函数用来打开一个注册过的数据库驱动
db.Prepare()函数用来返回准备要执行的sql操作, 然后返回准备完毕的执行状态。
db.Query()函数用来直接执行Sql返回Rows结果。
stmt.Exec()函数用来执行stmt准备好的SQL语句。
数据库驱动的注册在数据库驱动包导入时执行,注册的逻辑写在包的init函数中。导入驱动包只需要 import _ "driver/package"
,因为只需要执行其init()
,而不需要调用包中导出的方法,调用的是go语言规定的sql接口。