🎉

【Golang】初心者がAPIを作ってみる

2022/04/02に公開

はじめに

はじめに,本記事で筆者が使用している環境や必要なライブラリについてまとめます.

環境

PC MacBook Pro (16-inch, 2019)
OS Monterey
CPU 2.3 GHz 8コアIntel Core i9
メモリ 16GB
Go 1.17.6

なお,Goのバージョンは以下のコマンドで確認することができます.

terminal
go version

使用するライブラリ

本記事で用いるライブラリとバージョンをまとめますが

terminal
go mod init api

上記を実行してgo.modを作成した後,以下の様にgo mod tidyを実行してライブラリをインストールします.

terminal
go mod tidy
ライブラリ バージョン
gin 1.7.7
gorm 1.9.16
go-sqlite3 1.14.12

ファイル構成

本記事で使用するファイルは以下の通りです.

terminal
${ROOT}
├── data
│   └── questions.db
├── go.mod
├── go.sum
├── main.go
└── model
    └── db_model.go

コード

早速本題のコードを書いていきます.

モデルの作成

このファイルでは,データベースに接続するための設定を行います.
DataBase
使用するデータベースはSQLite3で,上記のような構成になっています.

model/db_model.go
package model

import (
	"github.com/jinzhu/gorm"
    // db_model.goでは使わないが,内部的に使われるためここでimportしておく
	_ "github.com/mattn/go-sqlite3"
)

type Question struct {
    // 大文字にしなければ値が取得できない
	ID         int    `gorm:"primary_key"`
	Year       int    `gorm:"not null"`
	Genre      string `gorm:"not null"`
	Question   string `gorm:"not null"`
	Answer     string `gorm:"not null"`
	Commentary string `gorm:"not null"`
}

func GetAll() []Question {
	db, err := gorm.Open("sqlite3", "data/questions.db")
	if err != nil {
		panic("failed to connect database")
	}

	questions := []Question{}

    // 全ての値を取得
	db.Find(&questions)

	return questions
}

func GetBy(tag string, num string) []Question {
	db, err := gorm.Open("sqlite3", "data/questions.db")
	if err != nil {
		panic("failed to connect database")
	}
	defer db.Close()

	questions := []Question{}
	db.Where(fmt.Sprintf("%s = ?", tag), num).Find(&questions)

	return questions
}

データベースから取得した値を表示する

ginを使ってデータベースから取得した値を表示します.

main.go
package main

import (
	"api/model"

	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()

	r.GET("/questions", func(c *gin.Context) {
        // 値を取得する
		questins := db_model.GetAll()
        // JSONで返す
		c.JSON(200, questins)
	})
	r.GET("/:tag/:num", func(c *gin.Context) {
		tag := c.Param("tag")
		num := c.Param("num")
		question := model.GetBy(tag, num)
		c.JSON(200, question)
	})

	r.Run()
}

結果

localhost
// http://localhost:8080/questions
[{"ID":1,"Year":2022,"Genre":"臨床生理学","Question":"問い1","Answer":"答え1","Commentary":"コメント1"},{"ID":2,"Year":2022,"Genre":"臨床血液学","Question":"問い2","Answer":"答え2","Commentary":"コメント2"}]
localhost
// http://localhost:8080/id/1
[{"ID":1,"Year":2022,"Genre":"臨床生理学","Question":"問い1","Answer":"答え1","Commentary":"コメント1"}]
localhost
// http://localhost:8080/year/2022
[{"ID":1,"Year":2022,"Genre":"臨床生理学","Question":"問い1","Answer":"答え1","Commentary":"コメント1"},{"ID":2,"Year":2022,"Genre":"臨床血液学","Question":"問い2","Answer":"答え2","Commentary":"コメント2"}]

躓いた点

  • モデルの定義で頭文字を大文字にしなければ値の取得ができなかった

おわりに

今回はGoを学び始めたばかりの筆者がライブラリを使用してAPIを作ってみるという記事でした.
こちらにソースコードを載せているのでぜひご覧ください↓

GitHubで編集を提案

Discussion