みま

満員電車つらい

GormでDB(MySQL)を操作してみた

Gormとは

gorm.io
Golang用のORMライブラリで、DBの操作を簡単に行うことが出来る。

環境

macOS 10.14.5
Golang ver 1.13.5 darwin/amd64
mysql ver 8.0.19

事前準備

$ cd $GOPATH/src
$ mkdir gorm-test
$ cd gorm-test
$ touch gorm.go

gormパッケージをインストール

go get github.com/jinzhu/gorm

実装

gorm.goを何かしらのエディタで開き、以下のように記述

package main

import (
	"fmt"

	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

type ImplDB struct {
	DB *gorm.DB
}

type User struct {
	UserID   uint   `gorm:"primary_key;auto_increment:false"`
	UserName string `gorm:"size:255"`
}

func (i *ImplDB) initDB() {
	var err error
	// USER、PASS、DBNMEなどは各自設定してある値を記述
	DBMS := "mysql"
	USER := "root"
	PASS := "password"
	PROTOCOL := "tcp(localhost:3306)"
	DBNAME := "sample"

	CONNECT := USER + ":" + PASS + "@" + PROTOCOL + "/" + DBNAME + "?charset=utf8&parseTime=True&loc=Local"
	i.DB, err = gorm.Open(DBMS, CONNECT)

	if err != nil {
		panic("DBへの接続に失敗しました")
	}
}

// スキーマのマイグレーション
func (i *ImplDB) initMigration() {
	i.DB.AutoMigrate(&User{})
}

func main() {
	i := &ImplDB{}

	// DBに接続
	i.initDB()

	// main関数が終わる際にDBの接続を切る
	defer i.DB.Close()

	// スキーマのマイグレーション
	i.initMigration()

	insertUser := User{}
	user := User{}
	user2 := User{}

	insertUser.UserID = 1
	insertUser.UserName = "hoge"

	// 作成
	// INSERT INTO users(user_id,user_name) VALUES(1,'hoge');
	i.DB.Create(&insertUser)

	// 取得
	// SELECT * FROM users WHERE user_id = 1;
	i.DB.Find(&user, "user_id = ?", 1)

	fmt.Println("取得したuserの値は", user)

	// 更新
	// UPDATE users SET user_name = 'fuga' WHERE user_id = 1 and user_name = 'hoge';
	i.DB.Model(&user).Update("user_name", "fuga")

	fmt.Println("更新後のuser:", user)

	// 削除
	// DELETE FROM users WHERE user_id = 1 and user_name = 'hoge';
	i.DB.Delete(&user)

	if err := i.DB.Find(&user2, "user_id = ?", 1).Error; err != nil {
		// エラーハンドリング
		fmt.Println("存在しませんでした")
	} else {
		fmt.Println("取得したuserの値は", user2)
	}
}
// スキーマのマイグレーション
func (i *ImplDB) initMigration() {
	i.DB.AutoMigrate(&User{})
}

ここではUserの構造体とDBのスキーマを比較して、不足しているカラムなどを追加。
またusersテーブルがない場合はusersテーブルを作成。
AutoMigrate()メソッドの引数にはアドレスを渡す。他のメソッド( Create()やFirst() など )も値ではなくアドレスを渡すのでそこは注意したい。

そして実行

$ go run hello.go
取得したuserの値は {1 hoge}
更新後のuser: {1 fuga}
存在しませんでした

で簡単にDB操作を行うことが出来た。
ちなみに上記の操作を一個の処理単位として行いたい場合はTransactionというものを使えば良いらしい。
gorm.io
以上、Gormの紹介でした。