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

Golang
  • URLをコピーしました!

こんにちは!RYOTAです!

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

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

目次

はじめに

業務でGo言語を扱う機会があったのでGORMを利用しデータアクセスを行ってみました。

Go言語でDB操作を行うのであればこの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は環境変数を読ませるために使用します。

Goライブラリ

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操作を一通り行ってみようと思います。

最後までご覧いただきありがとうございます!

Golang

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次