Gormでsql-migrateとseeder

##はじめに
今回の記事はGO初心者エンジニアの自分が
勉強したことを書いていく記事になります。
間違いだらけかもしれないので注意

今回は
Goのパッケージである
Gormとsql-migrateを使用します。
DBはmysqlを使用

※　dockerによる開発環境準備等は省きます

---
###Dockerfileに使用するパッケージの記載

```golang
FROM golang:latest

WORKDIR /go/src/api/

RUN go get -u github.com/labstack/echo \
  && go get github.com/jinzhu/gorm \
  && go get -u github.com/go-sql-driver/mysql \
  && go get github.com/rubenv/sql-migrate/...

EXPOSE 8080

```
gormとmysqlとsql-migrateを入れています。


###dbconfig.ymlを作成
```golang

development:
  dialect: mysql 
  datasource: root:rootpass@tcp(db:3306)/go_db?charset=utf8&parseTime=true&loc=Asia%2FTokyo
  dir: db/migrations
  table: migrations

```

補足
 dir: db/migrationsの欄はmigrations ファイルを作成する場所を記載する
今回は/db/migrationsフォルダ配下にmigrations ファイルが作成される　


次にコンテナを起動

```docker

$ docker-compose up -d
$ docker-compose exec app bash
```

###sql-migrateのコマンド実施
```docker
sql-migrate new テーブル名
```
このコマンドでmigrateファイルが作成される


例えば　usersテーブルのmigrateファイルを作成したいなら

```docker
sql-migrate new users
```

これで作成されている
db/migrations フォルダを見に行くと　中身が空のsqlファイルがあるはずです


###sqlを書く
```sql
CREATE TABLE IF NOT EXISTS users (
    id bigint AUTO_INCREMENT NOT NULL,
    name VARCHAR(255),
    email VARCHAR(255),
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP,
    deleted_at TIMESTAMP NULL DEFAULT NULL,
    PRIMARY KEY (id)
);
 
-- +migrate Down
DROP TABLE IF EXISTS users;
```
今回は　id　name　emailのカラムを持つusersテーブルを作成

###マイグレーションの実行
```docker
$ sql-migrate up
```

確認するには

```docker
$ sql-migrate status
```

```docker
+-----------------------------+-------------------------------+
|          MIGRATION          |            APPLIED            |
+-----------------------------+-------------------------------+
| 20210115071437-user.sql     | 2021-01-22 15:01:52 +0900 JST | 
+-----------------------------+-------------------------------+
```
これで実行されたmigrateファイルを確認できます。

---

###seederの作成と実行
users_seed.goの作成
今回は3名ほどuserを追加しておきましょう

```golang

package main
 
import (
    "fmt"
    "log"
    "time"
 
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)
 

type Users struct {
    Name     string
    Email    string
    CreatedAt time.Time
    UpdatedAt time.Time
}

//struct内は最初大文字で始まるように書く！！！！
 
func seeds(db *gorm.DB) error {

        users := Users{Name: "abe", Email: "abe@abe.com", CreatedAt: time.Now(), UpdatedAt: time.Now()}
    
        if err := db.Create(&users).Error; err != nil {
            fmt.Printf("%+v", err)
        }

        users2 := Users{Name: "asou", Email: "asou@asou.com", CreatedAt: time.Now(), UpdatedAt: time.Now()}
    
        if err := db.Create(&users2).Error; err != nil {
            fmt.Printf("%+v", err)
        }

        users3 := Users{Name: "suga", Email: "suga@suga.com", CreatedAt: time.Now(), UpdatedAt: time.Now()}
    
        if err := db.Create(&users3).Error; err != nil {
            fmt.Printf("%+v", err)
        }       

    
         return nil
}
 
func openConnection() *gorm.DB {
    db, err := gorm.Open("mysql", "root:rootpass@tcp(db:3306)/go_db?charset=utf8&parseTime=true&loc=Asia%2FTokyo")
    if err != nil {
        log.Fatalf("Couldn't establish database connection: %s", err)
    }
    return db
}
 
func main() {
    db := openConnection()
    defer db.Close()
    if err := seeds(db); err != nil {
        fmt.Printf("%+v", err)
        return
    }
}
```

動かしましょう！

```docker
$  go run user_seed.go
```


これでmigrateとseederの実装は完了です！


---
###参考サイト
https://ryotarch.com/go-lang/implement-migrate-and-seed-with-sql-migrate-and-gorm/