这是学习笔记的第 1733 篇文章

 

一直要做MySQL方向的一些数据管理定制工作,go就是一个很不错的切入点,拖来拖去,决定还是从一些小的地方开始慢慢切入。 

go和MySQL方向的直接切合点就是通过go来操作MySQL了。

有什么好的驱动呢?除了标准库的,目前我知道有两个。jmoiron和go-sql-driver。

对于评分控来说,一看star就能看出门道来。 

通过go操作MySQL_学习

 

通过go操作MySQL_学习_02

两者的协议不同,版本规模go-sql-driver略多一些,本次的初步对接是使用go-sql-driver来实现的,比较有意思的是,这个是go-sql-driver的一个logo,这只囊地鼠开始和海豚一起愉快的玩耍了。 

通过go操作MySQL_学习_03

 

我们假设一个场景,在一个表里插入数据,然后根据键值查取相应的值。

创建的表为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比较熟悉,写起来就很快了。