【Golang + GORM + MySQL】Go言語のORM「GORM」を使ってみた
目次
- ・| はじめに
- ・| GO+DBコンテナの作成
- ・| Dockerコンテナ作成
- ・| テストデータ挿入
- ・| GORMをインストール
- ・| Goモジュールモードオン
- ・| ライブラリインストール
- ・| 実装
- ・| さいごに
はじめに
業務でGo言語を扱う機会があったのでGORMを利用しデータアクセスを行ってみました。
Go言語でDB操作を行うのであればこのGORMを第一選択にするのではないかと思うので今後はこちらを中心に取り扱っていきたいと思います。
設定もとても簡単でデータベースにアクセスするだけでも導入する恩恵を得られるのがとても良いです。
- 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操作を一通り行ってみようと思います。
最後までご覧いただきありがとうございます!