2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Gormでsql-migrateとseeder

Last updated at Posted at 2021-06-15

##はじめに
今回の記事は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: "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
    }
}

動かしましょう!

$  go run user_seed.go

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


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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?