GORMの最初の一歩

moja
Goalist Blog
Published in
7 min readSep 5, 2023

はじめに
GORMはGo言語のための強力なORMライブラリです。データベース操作を簡単かつ効率的に行うことができます。
最初の一歩として、GORMのガイドに従い、Go言語でデータの作成と取得をどのように行うかについて、試してみました。

前提
・dockerでMySQL環境を設定済みとします。
・echoで、サーバーを作成します。
echoはGoのWebアプリケーションフレームワークです。)

0.準備
まずはじめに、echoをインストールします。

go get github.com/labstack/echo/v4

次に、GORMをインストールします。

go get -u github.com/go-gorm/gorm

mySqlドライバをインストールします。

go get gorm.io/driver/mysql

1.DB接続
まずは、ガイドを参考に、DB接続する記述をします。
DBへの接続を確認します。

func main() {
// インスタンスを作成
e := echo.New()

// ルートを設定
e.GET("/", connect)

// サーバーをポート番号1323で起動
e.Logger.Fatal(e.Start(":1323"))
}

// DB接続
func connect(c echo.Context) error {
db, _ := mysql.DB.DB()
defer db.Close()
err := db.Ping()
if err != nil {
return c.String(http.StatusInternalServerError, "DB Connection failed.")
} else {
return c.String(http.StatusOK, "DB Connected")
}
}
mysql/db.go

package mysql

import (
"log"

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

var DB *gorm.DB
var err error

func init() {
dsn := "test:password@tcp(db:3306)/go-test?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")
}
}

ブラウザでアクセスしてみます。
接続できました。

2.テーブルの作成
次にAuto Migrationを使用して、テーブルを作成します。
テーブル、外部キー、制約、カラム、インデックスの作成ができます。
まずはmodelを作成します。

package model

import "time"

type Member struct {
ID int64 `gorm:"primaryKey" json:"id" param:"id"`
Name string `json:"name"`
Email string `gorm:"unique" json:"email"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}

db.goに以下を追記します。

DB.AutoMigrate(&model.Member{})

サーバーを起動して、テーブルが作成されたか確認します。

3.POST
次にmemberを作成する処理を実装しましょう。
エンドポイントとhandlerを記述します。
main.goにエンドポイントを追加します。

e.POST("/members", handler.CreateMember)

handlerを記述します。リクエストから取得したデータから、DB.Createでレコードが作成されます。

func CreateMember(c echo.Context) error {
Member := model.Member{}
if err := c.Bind(&Member); err != nil {
return err
}
mysql.DB.Create(&Member)
return c.JSON(http.StatusCreated, Member)
}

POSTMANを利用して、実行してみます。
memberが作成され、Responseが返却されました。

4.GET
次に、作成したmemberを取得する方法を見てみましょう。
もうひとり”John Smith”というmemberを追加しておきます。
同様にmain.goにエンドポイントを追加、handlerにGetMembersを追加します。

e.GET("/members", handler.GetMembers)
func GetMembers(c echo.Context) error {
// クエリパラメータ "name" を取得
name := c.QueryParam("name")

Members := []model.Member{}
if name != "" {
// LIKEで名前を検索
mysql.DB.Where("name LIKE ?", "%"+name+"%").Find(&Members)
} else {
mysql.DB.Find(&Members)
}
return c.JSON(http.StatusOK, Members)
}

c.QueryParam(“name”) はクエリパラメータ “name” の値を取得します。もし “name” パラメータが提供されていれば、それを部分一致検索条件として mysql.DB.Where メソッドを使用してMemberを検索します。

一方、パラメータが提供されていなければ、全てのMemberデータを取得します。

5.GET(idで1件取得)
memberのmodelのIDに、param:”id”タグをつけています。Bindメソッドでパスパラメータを取得することができます。/members/1のようなパスで、Takeメソッドによって指定したIDのユーザーを1件取得できます。
レコードの取得について

e.GET("/members/:id", handler.GetMember)
func GetMember(c echo.Context) error {
Member := model.Member{}
if err := c.Bind(&Member); err != nil {
return err
}
mysql.DB.Take(&Member)
return c.JSON(http.StatusOK, Member)
}

PUTとDELETEについても、db.Saveやdb.Updatedb.Deleteを用いて、処理を作成することができます。

これらのステップを通じて、GORMを活用してGo言語でのデーターベースの操作の基本を理解しつつ、単純なAPIサーバーを作成することができました。

--

--