CentOS上でGo言語-MySQLを使う

DB初心者ですが、Go言語でMySQLからデータを取り出す必要が出てきたので検証してみました。
SQLもろくに書いたことないので、インストール～データ作成までやってみました。
記事初投稿なので、分かりづらいところがありましたら教えてくださいませ。

# やりたいこと
CentOSにMySQLをインストールして、テーブル作成、データ挿入をする。
作ったデータをGo言語を使って出力する。
※CentOSおよびGo開発環境は構築済みとする。

# 検証環境

OS: CentOS7
言語: Go 1.11.2 linux/amd64
DB: MySQL Ver 14.14 Distrib 5.7.25, for Linux (x86_64) ※最新

# MySQL準備
### インストール
- まずはyumのアップデート

```
$ sudo yum update
```

- MySQLのインストール

```
$ sudo yum -y install mysql mysql-server
> mysqlはmysqlのクライアント
> mysql-serverはmysqlのデーモン。サービス名はmysqld
```
## 起動
- サービスの起動

```
$ sudo service mysqld start
```
  ※次のエラーが出力される場合
    >  Failed to start mysqld.service: Unit not found.
  MySQLの公式リポジトリを使用できるようにして、ライブラリ群をインストールする

```
$ sudo yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
$ sudo yum -y install mysql mysql-devel mysql-server mysql-utilities
$ sudo service mysqld start
```
- サービスの起動確認

```
$ service mysqld status
Redirecting to /bin/systemctl status mysqld.service
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2019-01-28 01:46:39 UTC; 3min 47s ago
   ..
```
▶activeになっていることを確認

- OSに自動起動させるようにしておく

```
$ sudo chkconfig mysqld on
```

## 初期設定
- rootの初期パスワードチェック

```
$ cat /var/log/mysqld.log | grep 'temporary password'
2019-01-28T01:46:33.651124Z 1 [Note] A temporary password is generated for root@localhost: ###########
```
  ########### 部分に初期パスワードが表示される

- 初期設定を実行

```
$ mysql_secure_installation
```
 ▶  パスワード変更を実行する

## DB作成
- rootでログイン

```
$ mysql -uroot -p
```

- ユーザー作成

```
mysql> CREATE USER ユーザー名@localhost IDENTIFIED BY 'パスワード';
```

- データベースの作成

```
mysql> CREATE DATABASE testdb;
```

- 権限付与

```
mysql> GRANT ALL ON testdb.* TO ユーザー名@localhost;
```

- ユーザー切り替え

```
mysql> quit
$ mysql -u ユーザー名 -p
```

- データベース接続

```
mysql> use testdb;
```

## TABLEの作成
- テーブル作成

```
mysql> CREATE TABLE users(NAME varchar(20), AGE int, ID int AUTO_INCREMENT NOT NULL PRIMARY KEY);
```

## データ作成
- データ挿入

```
mysql> INSERT INTO testdb.users(NAME, AGE) value('Yamada Taro', 25);
mysql> INSERT INTO testdb.users(NAME, AGE) value('Suzuki Toshiyuki', 31);
```

- テーブル確認

```
mysql> select * from users;
+------------------+------+----+
| NAME             | AGE  | ID |
+------------------+------+----+
| Yamada Taro      |   25 |  1 |
| Suzuki Toshiyuki |   31 |  2 |
+------------------+------+----+
2 rows in set (0.00 sec)
```

# GoでDBへ接続

パッケージ準備

- MySQLの[ドライバーパッケージ](https://github.com/go-sql-driver/mysql)をインストール

```
$ go get -u github.com/go-sql-driver/mysql
```

- mysql.goを作成

```
$ mkdir $GOPATH/src/test-mysql && cd $GOPATH/src/test-mysql
$ touch mysql.go
```

```go:mysql.go
    package main
    import (
        "database/sql"
        "fmt"
        
        _ "github.com/go-sql-driver/mysql"
    )
    // User ユーザー型
    type User struct {
        ID   int64
        Name string
        Age  int64
    }
    func main() {
        // db接続
        db, err := sql.Open("mysql", "ユーザー名:パスワード@/testdb")
        if err != nil {
            panic(err.Error())
        }
        defer db.Close()
        
        // クエリ実行
        rows, err := db.Query("SELECT id,name,age FROM users")
        defer rows.Close()
        var users []User
        
        // データを保存
        for rows.Next() {
            var user User
            err := rows.Scan(&(user.ID), &(user.Name), &(user.Age))
            if err != nil {
                panic(err.Error())
            }
            users = append(users, user)
        }
        
        fmt.Println(users)
    }
```
- 実行

```
$ go run mysql.go
[{1 Yamada Taro 25} {2 Suzuki Toshiyuki 31}]
```

## 参考サイト
- [MySQLでGo](https://qiita.com/uguisu/items/96b438fb05f244a40a68)
- [Vagrant + CentOS + Nginx + MySQL + WordPress](https://qiita.com/TanakanoAnchan/items/d1e86d168ffb25c043ad)