見出し画像

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の場合は花子が取れたので、うまくいったようです。


いいなと思ったら応援しよう!