Web開発ログ | エンジニアに役立つ情報 | 開発の中での気づきを発信

高卒Devlog

【Golang + GORM + MySQL】Go言語のORM「GORM」を使ってみた

thumbnail

こんにちは! RYOTAです!

当記事をご覧くださりありがとうございます!

当記事はGo言語(Golang)でDBアクセスをするための設定を説明する記事となります!

はじめに

業務でGo言語を扱う機会があったのでGORMを利用しデータアクセスを行ってみました。
Go言語でDB操作を行うのであればこのGORMを第一選択にするのではないかと思うので今後はこちらを中心に取り扱っていきたいと思います。
設定もとても簡単でデータベースにアクセスするだけでも導入する恩恵を得られるのがとても良いです。

  • GORM

GORMガイド デベロッパーフレンドリーを目指した、Go言語のORMライブラリです。 特徴 フル機能ORM アソシエーション(Has One, Has Many, Belongs To, Many To Many, Polymorphism, Single-table inheritance) フック (Before/After Create/Save/Update/Del GORM

GO+DBコンテナの作成

今回も例のごとくサクッとDockerさんでテスト環境を作ります。

Dockerコンテナ作成

version: "3"
services:
  gorm:
    build: ./gorm
    tty: true
    volumes:
      - ./gorm:/go/src/work 
    ports:
      - 3000:3000

  db:
    container_name: db
    image: mysql:8.0
    volumes:
      - gorm_data:/var/lib/mysql
      - ./logs:/var/log/mysql
      - ./db/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASS}
      - MYSQL_ROOT_PASSWORD=${DB_PASS}
      - TZ=${TZ}
    ports:
      - ${DB_PORT}:3306

networks:
  default:

volumes:
  gorm_data:

Dockerの設定が完了したら早速コンテナを起動します。

$ docker-compose build
$ docker-compose up -d

テストデータ挿入

DBにアクセスしデータが取得できることを確認したいので適当なデータを入れておきましょう。
今回はUsersとか適当に入れておきます。

$ docker-compose exec db bash
$ mysql -u root -p

問題なくDBが作成されているのでテーブル作ってデータを突っ込んでおきます。

GORMをインストール

早速本題です。
Goのモジュールモードをオンにしたらそのままメインのライブラリをインストールします。
今回使うのは下記のライブラリです。joho/godotenvは環境変数を読ませるために使用します。

  • jinzhu/gorm
  • go-sql-driver/mysql
  • joho/godotenv

GitHub - jinzhu/gorm: GORM V1, V2 moved to https://github.com/go-gorm/gorm GORM V1, V2 moved to https://github.com/go-gorm/gorm - GitHub - jinzhu/gorm: GORM V1, V2 moved to https://github.com/go-gorm/gorm GitHub
GitHub - go-sql-driver/mysql: Go MySQL Driver is a MySQL driver for Go's (golang) database/sql package Go MySQL Driver is a MySQL driver for Go's (golang) database/sql package - GitHub - go-sql-driver/mysql: Go MySQL Driver is a MySQL driver for Go's (golang) database/sql package GitHub
GitHub - joho/godotenv: A Go port of Ruby's dotenv library (Loads environment variables from .env files) A Go port of Ruby's dotenv library (Loads environment variables from .env files) - GitHub - joho/godotenv: A Go port of Ruby's dotenv library (Loads environment variables from .env files) GitHub

Goモジュールモードオン

$ docker-compose exec gorm bash
$ go mod init echo-test tmp-gorm-mysql

ライブラリインストール

$ go get -u github.com/jinzhu/gorm
$ go get -u github.com/go-sql-driver/mysql
$ go get -u github.com/joho/godotenv

実装

とりあえずテストなのでmain.goに殴り書きします。

モジュールインポート

import (
	"fmt"
	"os"

	_ "github.com/go-sql-driver/mysql"
	gorm "github.com/jinzhu/gorm"
	godotnev "github.com/joho/godotenv"
)

構造体を定義

type User struct {
	Id   int    `gorm:"column:id"`
	Name string `gorm:"column:name"`
	Age  int    `gorm:"column:age"`
}

DB接続設定

今回ハマったのはここ。
HOSTの設定はコンテナ名:ポートにしないとアクセスできませんのでご注意ください。

// ENV読み取り
err := godotnev.Load(".env")
if err != nil {
	fmt.Printf("読み込みに失敗しました: %v", err)
}

// 接続情報を設定
DBMS := "mysql"
USER := os.Getenv("DB_USER")
PASS := os.Getenv("DB_PASS")
// (localhost:3306ではなく) (コンテナ名:3306)
HOST := "tcp(db:3306)"
DBNAME := os.Getenv("DB_NAME")

CONNECT := USER + ":" + PASS + "@" + HOST + "/" + DBNAME

// DBに接続
db, err := gorm.Open(DBMS, CONNECT)
if err != nil {
	panic(err.Error())
}

データ取得

定義した構造体(User)をもとにデータを取得します。
他でいうModelに該当する感じですかね?(違ったらすみません。)

// データ取得
var users []User
db.Find(&users)
defer db.Close()

fmt.Print(users)

動作テスト

$ go run main.go

データが取れてますね!!!
簡単!!!

さいごに

今回はGo言語のORM【GORM】を使ってDBからデータを取得してみました。
ORMを使わずにDBアクセスしようとすると大変でしたがGORMを使うと簡単にアクセスが可能ですね!
これだけでも導入する恩恵があって良きです!
今回は簡単なSELECTだけなので、次回はCLUD操作を一通り行ってみようと思います。
最後までご覧いただきありがとうございます!