Echo

2021年1月16日

【Go】Echo + GORM(v2) + MySQLで簡易サンプルソース

Echo + GORM(v2)をAWS EC2上に構築に構築

Clean Architectureを採用する前に、とてもシンプルなサンプルソースになります。

AWS EC2にインスタンスを作成、goのインストールをします。
GORMですが、日本語情報のほとんどが旧バージョンv1を元にしたものが多いのでご注意ください。

  • go version go1.15.6
  • Echo v4.1.17
  • GORM v2

なお、AWS EC2 (Amazon Linux 2)へのGoのインストールは、前の記事をご確認ください。

AWS EC2にMySQLをインストール、事前にデータベースを作成しておきます。
ここではAWS EC2へのMySQLインストール方法の説明は省きます。

作成するDB名「db_name」は適宜変更してください。

mysql> CREATE DATABASE db_name

ディレクトリ構造

ディレクトリ構造は下記になります。
sampleディレクトリは/home/ec2-user/go/src 直下に作成しました。

└── src
    └── sample
        ├── controller
        │   └─ user_controller.go
        ├── go.mod
        ├── go.sum
        ├── main.go
        ├── model
        │   ├── db.go
        │   └── user.go
        ├── router
        │   └── router.go

controller/user_controller.go

コントローラーを作成します。CRUDそれぞれの関数を作成します。

package controller

import (
	"net/http"
	"strconv"

	"sample/model"

	"github.com/labstack/echo/v4"
)

func GetUser(c echo.Context) error {
	i, _ := strconv.Atoi(c.Param("id"))
	id := uint(i)
	user := model.User{}
	user.FirstById(id)

	return c.JSON(http.StatusOK, user)
}

func CreateUser(c echo.Context) error {
	name := c.FormValue("name")
	a, _ := strconv.Atoi(c.FormValue("age"))
	age := uint(a)

	user := model.User{
		Name:  name,
		Age:   age,
	}
	user.Create()

	return c.JSON(http.StatusOK, user)
}

func UpdateUser(c echo.Context) error {
	i, _ := strconv.Atoi(c.Param("id"))
	id := uint(i)
	name := c.FormValue("name")
	a, _ := strconv.Atoi(c.FormValue("age"))
	age := uint(a)

	user := model.User{
		ID:    id,
		Name:  name,
		Age:   age,
	}
	user.Updates()

	return c.JSON(http.StatusOK, user)
}

func DeleteUser(c echo.Context) error {
	i, _ := strconv.Atoi(c.Param("id"))
	id := uint(i)
	user := model.User{}
	user.DeleteById(id)

	return c.JSON(http.StatusOK, user)
}

model/db.go

import部分のGORMの読み込みや、DB接続部分の記述はv2用です。
v1と互換性が無いのでご注意ください。

DB接続部分のroot:passwordはDBユーザー名とパスワードに適宜変更。
/db_name?の部分も作成したDB名に適宜変更してください。

package model

import (
	"log"

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

var DB *gorm.DB
var err error

func init() {
	dsn := "root:password@tcp(127.0.0.1:3306)/db_name?charset=utf8mb4&parseTime=True&loc=Local"
	DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatalln(dsn + "database can't connect")
	}
	DB.AutoMigrate(&User{})
}

model/user.go

作成したDBの構造に合わせてモデルの作成をします。
ユーザー名「Name」と年齢「Age」を持ちます。

package model

import (
	"time"

	"gorm.io/gorm"
)

type User struct {
	ID        uint      `json:"id"`
	Name      string    `json:"name" gorm:"type:varchar(255);not null"`
	Age       uint      `json:"age" gorm:"not null;default:0"`
	CreatedAt time.Time `json:"created_at"`
	UpdatedAt time.Time `json:"updated_at"`
}

func (p *User) FirstById(id uint) (tx *gorm.DB) {
	return DB.Where("id = ?", id).First(&p)
}

func (p *User) Create() (tx *gorm.DB) {
	return DB.Create(&p)
}

func (p *User) Save() (tx *gorm.DB) {
	return DB.Save(&p)
}

func (p *User) Updates() (tx *gorm.DB) {
	return DB.Model(&p).Updates(p)
}

func (p *User) Delete() (tx *gorm.DB) {
	return DB.Delete(&p)
}

func (p *User) DeleteById(id uint) (tx *gorm.DB) {
	return DB.Where("id = ?", id).Delete(&p)
}

router/router.go

接続するポート番号「8080」は適宜変更してください。
AWSのセキュリティーグループで、ポートの解放をしておいてください。

package router

import (
	"net/http"

	"sample/controller"

	"github.com/labstack/echo/v4"
)

func Init() {
	e := echo.New()

	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello, World!")
	})
	e.GET("/user/:id", controller.GetUser)
	e.POST("/user", controller.CreateUser)
	e.PUT("/user/:id", controller.UpdateUser)
	e.DELETE("/user/:id", controller.DeleteUser)

	e.Logger.Fatal(e.Start(":8080"))
}

main.go

routeの初期化を呼び出します。

package main

import (
	"sample/router"
)

func main() {
	router.Init()
}

Goを実行

下記のコマンドでGoを実行します。

$ cd /home/ec2-user/go/src/sample
$ go mod init
$ go run main.go

   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.1.17
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\

Curlで動作テスト

データベースへの登録を、Curlコマンドで実行して動作確認します。
ここでは説明を省きますが、Postmanなどのツールで動作確認も可能です。

AWS EC2のパス「http://ec2-xx-xx-xxx-xxx.ap-northeast-1.compute.amazonaws.com:8080」は適宜変更をお願いします。

Create

$ curl -X POST http://ec2-xx-xx-xxx-xxx.ap-northeast-1.compute.amazonaws.com:8080/user -d "name=Yamada&age=20"

Update

$ curl -X PUT http://ec2-xx-xx-xxx-xxx.ap-northeast-1.compute.amazonaws.com:8080/user/1 -d "name=Suzuki&age=24"

Read

$ curl -X GET http://ec2-xx-xx-xxx-xxx.ap-northeast-1.compute.amazonaws.com:8080/user/1

Delete

$ curl -X DELETE http://ec2-xx-xx-xxx-xxx.ap-northeast-1.compute.amazonaws.com:8080/user/1

MySQLに接続して、DBに正常に作成・更新・削除ができるがご確認ください。
これでサンプルソースの説明は以上になります。

次回の記事は、テンプレート機能を使ってブラウザにフォームを表示させます。

LINEで送る
Pocket

label

Written by
isaka

バックエンドエンジニア

CONTACT

お問い合わせ、ご依頼などは下記電話番号かメールアドレスまでご連絡ください。
※内容により回答までお時間をいただく場合がございます、予めご了承ください。

tel. 06-6534-9333

10:00-19:00(※土日祝を除く)