Go言語でデータベースを扱う
前回はGo言語のGinというフレームワークを使って静的なデータを返すAPIを作りましたが、今回はデータを動的に返せるようにリレーショナルデータベースを利用しようと思います。
データベースにはSQLite3、ORMにはGORMを利用します。
これがソースコードの全体です。
package main
import (
"strconv"
"net/http"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"gorm.io/driver/sqlite"
)
type Customer struct {
gorm.Model
Name string
PhoneNo string
Email string
}
func main() {
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("Failed to connect database")
}
db.AutoMigrate(&Customer{})
db.Select("Name", "PhoneNo", "Email").Create(&Customer{Name: "太郎", PhoneNo: "09011111111", Email: "taro@example.com"})
db.Select("Name", "PhoneNo", "Email").Create(&Customer{Name: "花子", PhoneNo: "09022222222", Email: "hanako@example.com"})
r := gin.Default()
r.GET("/customers/:id", func(c *gin.Context){
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("Failed to connect database")
}
id, _ := strconv.Atoi(c.Param("id"))
var customer Customer
db.Where("`customers`.`id` = ?", id).First(&customer)
c.JSON(http.StatusOK, gin.H{
"customer": customer,
})
})
r.Run()
}
まず、GORMとデータベースドライバをインポートします。
import (
"gorm.io/gorm"
"gorm.io/driver/sqlite"
)
構造体にgorm.Modelを入れることで、ID、CreatedAt、UpdatedAt、DeletedAtが自動的に挿入されます。
type Customer struct {
gorm.Model
Name string
PhoneNo string
Email string
}
SQLite3のデータベースファイルを指定します。ファイルが存在しない場合は、自動的に作成もしてくれます。
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("Failed to connect database")
}
customersテーブルの作成と初期データをインサートします。
あまりいい方法ではないのでここはマイグレーション機能を使って今後改善することにしましょう。
db.AutoMigrate(&Customer{})
db.Select("Name", "PhoneNo", "Email").Create(&Customer{Name: "太郎", PhoneNo: "09011111111", Email: "taro@example.com"})
db.Select("Name", "PhoneNo", "Email").Create(&Customer{Name: "花子", PhoneNo: "09022222222", Email: "hanako@example.com"})
c.Param("id")でコンテキストにあるURLパラメータからidの値を取得します。
strconv.Atoi()は文字列型を数値型に変換する関数です。Go言語は静的型付け言語なので型には厳しいのです。
id, _ := strconv.Atoi(c.Param("id"))
構造体の変数を定義してデータベースからID指定でレコードを1行取得します。
var customer Customer
db.Where("`customers`.`id` = ?", id).First(&customer)
アプリケーションを起動します。
ID=1の場合は太郎で、ID=2の場合は花子が取れたので、うまくいったようです。