k01ken’s b10g

He110 W0r1d!

GORMを使ってGoでORMを行う

開発環境はWindows10 Professional(64bit) + go1.15.3 windows/amd64

GoでORM(オブジェクト関係マッピング)を行うためには、GORMというパッケージを使用します。


全体の流れとして、

  1. データベースに接続して、接続に成功させる
  2. データベース側に命令するためのSQL文(を発行するための関数)をGoで書く
  3. データベースに送信し、結果を受け取る

となります。

プロジェクトの作成

コマンドプロンプトで以下のコマンドを一行ずつ入力してください

cd c:\
mkdir gorm_sample
cd gorm_sample
go mod init gorm_sample

データベースの接続

使用するデータベースはMySQLとします。
以下のファイルをmain.goという名前で、gorm_sampleディレクトリに保存してください。

package main

import(
  "gorm.io/gorm"
  "gorm.io/driver/mysql"
  "fmt"
  "log"
)

const(
  DBNAME = "dbname"
  USERNAME = "username"
  PASSWORD = "password"
  IPADDRESS = "127.0.0.1"
  PORTNUMBER = "3306"
)

func DatabaseConnection() (*gorm.DB, error){
  dsn := USERNAME + ":" + PASSWORD + "@tcp(" + IPADDRESS + ":" + PORTNUMBER + ")/" + DBNAME + "?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  return db,err
}

func main(){
  _, err := DatabaseConnection()
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println("接続成功しました")
}

以下のコマンドを入力してプログラムを実行します。

go run main.go

実行結果
f:id:k01ken:20210103155756p:plain

データベース側に命令を出して、取得する

Goでは、テーブルに対応したモデルを構造体で作り、それに基づき、操作します。
テーブルを自動で作成し、データを追加し、データを検索し、テーブルを削除します。
データベースを用いる自動テストにちょうど良いです。

package main

import(
  "gorm.io/gorm"
  "gorm.io/driver/mysql"
  "fmt"
  "log"
  "time"
)

const(
  DBNAME = "dbname"
  USERNAME = "username"
  PASSWORD = "password"
  IPADDRESS = "127.0.0.1"
  PORTNUMBER = "3306"
)

type Tests struct{
  Id int `gorm:"primaryKey;type:INTEGER AUTO_INCREMENT"`
  Name string `gorm:"not null;type:VARCHAR(255)"`
  Created time.Time `gorm:"not null;type:DATETIME"`
}

func DatabaseConnection() (*gorm.DB, error){
  dsn := USERNAME + ":" + PASSWORD + "@tcp(" + IPADDRESS + ":" + PORTNUMBER + ")/" + DBNAME + "?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  return db,err
}

func main(){
  db, err := DatabaseConnection()
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println("接続成功しました")

  // 自動でテーブルが作成される
  db.AutoMigrate(&Tests{})

  // データを5件追加
  userlist := [5]string{"Koiken", "Taro", "Jiro", "Saburo", "Shirou"}
  var create_err error
  for i := 0; i < 5; i++ {
    create_err = db.Create(&Tests{Name: userlist[i], Created: time.Now()}).Error
    if create_err != nil {
      log.Fatal(create_err)
    }else{
      fmt.Println("データを追加しました")
    }
  }

  // 指定のデータだけ読みだす
  result := []Tests{}
  db.Where("name = ?", "Koiken").Find(&result)
  fmt.Println(result[0].Name) // Koiken

  // テーブルを自動削除する
  db.Migrator().DropTable(&Tests{})
}

上記のコードで以下のSQL文と同じテーブルが自動で作成されます。

CREATE TABLE tests(
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  created DATETIME NOT NULL
)charset=utf8mb4;

構造体のタグは、
Declaring Models | GORM - The fantastic ORM library for Golang, aims to be developer friendly.
のFields Tagsの欄を参考にしました。

テーブルの自動作成/削除は以下を参考にしました。
Migration | GORM - The fantastic ORM library for Golang, aims to be developer friendly.


■参考リンク
GORMガイド | GORM - The fantastic ORM library for Golang, aims to be developer friendly.