这是学习笔记的第 1733 篇文章
一直要做MySQL方向的一些数据管理定制工作,go就是一个很不错的切入点,拖来拖去,决定还是从一些小的地方开始慢慢切入。
go和MySQL方向的直接切合点就是通过go来操作MySQL了。
有什么好的驱动呢?除了标准库的,目前我知道有两个。jmoiron和go-sql-driver。
对于评分控来说,一看star就能看出门道来。
两者的协议不同,版本规模go-sql-driver略多一些,本次的初步对接是使用go-sql-driver来实现的,比较有意思的是,这个是go-sql-driver的一个logo,这只囊地鼠开始和海豚一起愉快的玩耍了。
我们假设一个场景,在一个表里插入数据,然后根据键值查取相应的值。
创建的表为user,
mysql> create table user(id int not null primary key auto_increment,username varchar(30),password varchar(64));
Query OK, 0 rows affected (0.12 sec)
然后下载相应的驱动包。
go get github.com/go-sql-driver/mysql
使用如下的代码来完成初步的对接。
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"log"
)
func insert(db *sql.DB) {
stmt, err := db.Prepare("INSERT INTO user(username, password) VALUES(?, ?)")
defer stmt.Close()
if err != nil {
log.Println(err)
return
}
stmt.Exec("jeanron", "test100")
stmt.Exec("jianrong", "testabc")
}
func main() {
db, err := sql.Open("mysql", "root:test@tcp(127.0.0.1:3306)/testdb?charset=utf8")
log.Println(db)
if err != nil {
log.Fatalf("Open database error: %s\n", err)
}
defer db.Close()
err = db.Ping()
log.Println(err)
if err != nil {
log.Fatal(err)
}
insert(db)
rows, err := db.Query("select id, username from user where id = ?", 1)
if err != nil {
log.Println(err)
}
defer rows.Close()
var id int
var name string
for rows.Next() {
err := rows.Scan(&id, &name)
if err != nil {
log.Fatal(err)
}
log.Println(id, name)
}
err = rows.Err()
if err != nil {
log.Fatal(err)
}
}
其中数据库连接的方式是一个重点:
连接串使用如下的规则来建立连接:
用户名:密码@协议(地址:端口)/数据库?参数=参数值
对应的代码为:
db, err := sql.Open("mysql", "root:xxxx@tcp(127.0.0.1:3306)/testdb?charset=utf8")
为了跟进执行过程中的日志细节,我加了几个debug的日志打印,可以看到整个执行的流程情况。
脚本执行的结果如下:
# go run test.go
2018/09/03 23:49:05 &{{root:jjmatch@tcp(127.0.0.1:3306)/testdb?charset=utf8 0x745188} 0 {0 0} [] map[] 0 0 0xc420070120 0xc420064060 false map[] map[] 0 0 0 <nil> 0x4aeea0}
2018/09/03 23:49:05 <nil>
2018/09/03 23:49:05 1 jeanron
通过这样一段简短的代码,可以很快的掌握go语言的特性,如果对Java和Python比较熟悉,写起来就很快了。