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.Update、db.Deleteを用いて、処理を作成することができます。
これらのステップを通じて、GORMを活用してGo言語でのデーターベースの操作の基本を理解しつつ、単純なAPIサーバーを作成することができました。