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