goのWebFrameWork "gin" を使ってみた

概要

goのWebFrameWork "gin" を使ってみた。

github.com

DB(MySQL)からデータを取ってきてJSON化させて返却するところまで実装。

ソースコード

以下のサンプルが実装されています。

  • gormの設定
  • sql-migrateの設定
  • migrationコード
  • seedコード
  • gormを使ったデータの取得

github.com

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を使用。

github.com

マイグレーションファイルの例

-- +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を使って生で書いた。 テストデータは全部適用。

github.com

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
}