GoとGORMを使った勉強(1)　

#概要
・GoとGORMを使ってDBに接続してテーブルの情報を画面に表示させます。
・[続き](https://qiita.com/yamauchikei/items/cb739cc86d8b0a5d851e)あります。


#環境
・DockerでGoの環境構築
　`docker run -itd -p 8080:80 golang:latest`


#準備
````:Docker
#mysqlの用意
root@df86ed89dfdc:/go# apt update
root@df86ed89dfdc:/go# apt install mariadb-server
root@df86ed89dfdc:/go# service mariadb start

#初期設定
root@df86ed89dfdc:~# mysql_secure_installation


````

##データの用意

````
#mysqlにログイン
root@3ba225e11191:~# mysql -u root -p

#DBを作る
MariaDB [(none)]> create database hoge;

#createしたDBに入る
MariaDB [(none)]> use hoge
Database changed

#usersテーブルを作る
MariaDB [hoge]> create table users(id int auto_increment,name varchar(255),index(id),created_at datetime,updated_at datetime,deleted_at datetime);

#usersテーブルの状態を確認する
MariaDB [hoge]> desc users;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | MUL | NULL    | auto_increment |
| name       | varchar(255) | YES  |     | NULL    |                |
| created_at | datetime     | YES  |     | NULL    |                |
| updated_at | datetime     | YES  |     | NULL    |                |
| deleted_at | datetime     | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

#データを追加
MariaDB [hoge]> insert into users values(null,"sample_user",null,null,null);

MariaDB [hoge]> select * from users;
+----+-------------+------------+------------+------------+
| id | name        | created_at | updated_at | deleted_at |
+----+-------------+------------+------------+------------+
|  1 | sample_user | NULL       | NULL       | NULL       |
+----+-------------+------------+------------+------------+
````

#DBにユーザーを追加して権限を与える
rootユーザーではエラーが出る

````
#登録されてるホストとユーザー名の確認
MariaDB [hoge]> select user, host from mysql.user;
+-------------+-----------+
| User        | Host      |
+-------------+-----------+
| mariadb.sys | localhost |
| mysql       | localhost |
| root        | localhost |
+-------------+-----------+

#fugaというユーザーを追加する
MariaDB [(none)]> create user 'fuga'@'localhost' identified by 'fugapass';


#fugaの権限を確認する
MariaDB [hoge]> show grants for fuga@localhost;
+-------------------------------------------------------------------------------------------------------------+
| Grants for fuga@localhost                                                                                   |
+-------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `fuga`@`localhost` IDENTIFIED BY PASSWORD '*7449FCB52B0D3D41243103FA7B23D545CD33F2A5' |
+-------------------------------------------------------------------------------------------------------------+


#fugaにhogeDBの操作権限を与える　
MariaDB [hoge]> grant all privileges on hoge.* to "fuga"@"localhost";

#fugaの権限を確認する
MariaDB [hoge]> show grants for fuga@localhost;
+-------------------------------------------------------------------------------------------------------------+
| Grants for fuga@localhost                                                                                   |
+-------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `fuga`@`localhost` IDENTIFIED BY PASSWORD '*7449FCB52B0D3D41243103FA7B23D545CD33F2A5' |
| GRANT ALL PRIVILEGES ON `hoge`.* TO `fuga`@`localhost`                                                      |
+-------------------------------------------------------------------------------------------------------------+

MariaDB [hoge]> exit
````

#コーディング

````golang:main.go
package main

import (
	"github.com/gin-gonic/gin"
	_ "github.com/joho/godotenv/autoload"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	r := gin.Default()

	r.GET("/users", ListUsers)

	r.Run(":80")

}

func DB() *gorm.DB {
	dsn := "fuga:fugapass@tcp(127.0.0.1:3306)/hoge?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	if err != nil {
		panic("failed to connect database")
	}
	return db
}

func ListUsers(c *gin.Context) {
	var users []User
	db := DB()
	db.Find(&users) // find product with integer primary key
	c.JSON(200, gin.H{
		"user": users,
	})
}

type User struct {
	gorm.Model
	Name string
}

````

##Ginをダウンロードする

````:Docker
root@df86ed89dfdc:~# go get github.com/gin-gonic/gin
root@df86ed89dfdc:~# go mod init example.com/m
root@df86ed89dfdc:~# go mod vendor
````

#確認

http://localhost:8080/users

#補足
###ユーザーを追加した理由
rootユーザーを使ってDBに接続しようとしたらエラーになるので新たにユーザを追加しました。