Gormでsql-migrateとseeder


はじめに

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

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

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


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

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を作成


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-compose up -d
$ docker-compose exec app bash

sql-migrateのコマンド実施

sql-migrate new テーブル名

このコマンドでmigrateファイルが作成される

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

sql-migrate new users

これで作成されている
db/migrations フォルダを見に行くと 中身が空の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テーブルを作成

マイグレーションの実行

$ sql-migrate up

確認するには

$ sql-migrate status
+-----------------------------+-------------------------------+
|          MIGRATION          |            APPLIED            |
+-----------------------------+-------------------------------+
| 20210115071437-user.sql     | 2021-01-22 15:01:52 +0900 JST | 
+-----------------------------+-------------------------------+

これで実行されたmigrateファイルを確認できます。


seederの作成と実行

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


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: "[email protected]", CreatedAt: time.Now(), UpdatedAt: time.Now()}

        if err := db.Create(&users).Error; err != nil {
            fmt.Printf("%+v", err)
        }

        users2 := Users{Name: "asou", Email: "[email protected]", CreatedAt: time.Now(), UpdatedAt: time.Now()}

        if err := db.Create(&users2).Error; err != nil {
            fmt.Printf("%+v", err)
        }

        users3 := Users{Name: "suga", Email: "[email protected]", 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
    }
}

動かしましょう!

$  go run user_seed.go

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


参考サイト