goのWebFrameWork "gin" を使ってみた
概要
goのWebFrameWork "gin" を使ってみた。
DB(MySQL)からデータを取ってきてJSON化させて返却するところまで実装。
ソースコード
以下のサンプルが実装されています。
- gormの設定
- sql-migrateの設定
- migrationコード
- seedコード
- gormを使ったデータの取得
main.go
データを取得してデータを返却する。
localhost:5050/zoosでアクセスするとデータが帰ってくる。
package main import ( "github.com/gin-gonic/gin" "hasGoriraAPI/app/service" _"encoding/json" ) func main() { r := gin.Default() r.GET("/zoos", func(c *gin.Context) { var zooService service.ZooService zoos := zooService.GetZoos() c.JSON(200, zoos) }) r.Run(":5050") }
Migration
Migrationは、sql-migrateを使用。
マイグレーションファイルの例
-- +migrate Up CREATE TABLE IF NOT EXISTS prefectures ( id int(15) AUTO_INCREMENT, name varchar(255), created_at datetime default current_timestamp, updated_at timestamp default current_timestamp on update current_timestamp, PRIMARY KEY (id)); -- +migrate Down DROP TABLE IF EXISTS prefectures;
Seed Data
Gormを使って生で書いた。 テストデータは全部適用。
package main import ( "hasGoriraAPI/app/model" "hasGoriraAPI/db" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) func main() { connection := db.DBConnect() defer connection.Close() createPrefectureSeedData(connection) createZooSeedData(connection) } func createPrefectureSeedData(connection *gorm.DB){ prefs := []model.Prefecture{ { Name: "北海道"}, { Name: "青森県" }, { Name: "岩手県" }, { Name: "宮城県" }, { Name: "秋田県" }, { Name: "山形県" }, { Name: "福島県" }, { Name: "茨城県" }, { Name: "栃木県" }, { Name: "群馬県" }, { Name: "埼玉県" }, { Name: "千葉県" }, { Name: "東京都" }, { Name: "神奈川県" }, { Name: "新潟県" }, { Name: "富山県" }, { Name: "石川県" }, { Name: "福井県" }, { Name: "山梨県" }, { Name: "長野県" }, { Name: "岐阜県" }, { Name: "静岡県" }, { Name: "愛知県" }, { Name: "三重県" }, { Name: "滋賀県" }, { Name: "京都府" }, { Name: "大阪府" }, { Name: "兵庫県" }, { Name: "奈良県" }, { Name: "和歌山県" }, { Name: "鳥取県" }, { Name: "島根県" }, { Name: "岡山県" }, { Name: "広島県" }, { Name: "山口県" }, { Name: "徳島県" }, { Name: "香川県" }, { Name: "愛媛県" }, { Name: "高知県" }, { Name: "福岡県" }, { Name: "佐賀県" }, { Name: "長崎県" }, { Name: "熊本県" }, { Name: "大分県" }, { Name: "宮崎県" }, { Name: "鹿児島県" }, { Name: "沖縄県" }, } for _, pref := range prefs { connection.Create(&pref) } } func createZooSeedData(connection *gorm.DB){ zoos := []model.Zoo{ { PrefId: 1, Name: "北海道ゴリラ大学", HasGorira:true }, { PrefId: 12, Name: "ぽんぽこ動物園", HasGorira:false }, { PrefId: 3, Name: "わにわに博物館", HasGorira:false }, { PrefId: 33, Name: "ゴリラの里", HasGorira:true }, { PrefId: 22, Name: "白鳥の森", HasGorira:false }, } for _, zoo := range zoos { connection.Create(&zoo) } }
大規模なテストデータを管理する時は他の専用ライブラリを使ったほうが良さそう。
Model
モデル層を実装。
Prefecture Model
package model type Prefecture struct { Name string }
Zoo Model
package model type Zoo struct { PrefId int Name string HasGorira bool }
Service
サービス層を実装。
データをJOINして返却する。
gormが結構便利だった。
package service import ( "hasGoriraAPI/db" ) type zooRecord struct { Name string PrefName string HasGorira bool } type ZooService struct{} func (s *ZooService) GetZoos() []zooRecord{ connection := db.DBConnect() defer connection.Close() var records []zooRecord connection. Table("zoos"). Select("zoos.name, prefectures.name as pref_name, zoos.has_gorira"). Joins("left outer join prefectures on prefectures.id = zoos.pref_id"). Scan(&records) return records }