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のドライバーパッケージをインストール
$ go get -u github.com/go-sql-driver/mysql
- mysql.goを作成
$ mkdir $GOPATH/src/test-mysql && cd $GOPATH/src/test-mysql
$ touch mysql.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}]