🎉
【Golang】初心者がAPIを作ってみる
はじめに
はじめに,本記事で筆者が使用している環境や必要なライブラリについてまとめます.
環境
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
コード
早速本題のコードを書いていきます.
モデルの作成
このファイルでは,データベースに接続するための設定を行います.
使用するデータベースは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を作ってみるという記事でした.
こちらにソースコードを載せているのでぜひご覧ください↓
Discussion