3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Golangにおけるgormを利用したDB接続の方法

Posted at

概要

私は個人的にGoを学習しています。

その中でデータベースとやりとりするのにgormというORMを知りました。

なので今日はgormを利用したデータベースとの接続方法について書き残したいと思います。

環境

今回はDockerComposeを使用して実践していきます。

まず下記のようなDockerfileを使用します。

FROM golang:1.20-alpine3.16
ENV ROOT /app
WORKDIR ${ROOT}
RUN apk update && apk add --no-cache git
COPY go.mod go.sum ./
RUN go mod download
COPY
EXPOSE 8080
CMD["go", "run", "main.go"]

本番環境で利用する場合、マルチステージビルトを採用して

ビルドステージと本番用ステージを記載した方がいいと思いますが今回はスコープ外とします。

docker-compose.yml
version: '3.8'
services:
  db:
    image: mysql:8.0
    container_name: mysql
    env_file:
      - .env
    environment:
      MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD
      MYSQL_DATABASE: $DB_NAME
      MYSQL_USER: $DB_USER
      MYSQL_PASSWORD: $DB_PASSWORD
    volumes:
      - ./mysql:/var/lib/mysql
    ports:
      - 3306:3306

  api:
    build:
      context: .
      target: dev
    container_name: api
    working_dir: /app
    env_file:
      - .env
    volumes:
      - .:/app
    ports:
      - 8080:8080
    depends_on:
      - db

各環境変数の値は.envファイルで設定してください。

gormとは

結論、Goで利用できるORMです。

ORMとはObject–relational mappingの略で直感的にデータベースとやりとりするためのツールです。

通常Goに標準パッケージとして搭載されているdatabase/sqlを利用してデータベースとやりとりする際は

SQLを都度記載して、それを実行するという流れになります。

しかし、gormを利用することでSQLを書かなくてもデータベースとのやりとりを実現できます。

たとえば、Createなどを利用することで簡単にデータの作成が可能です。

もし詳しく知りたい方は下記を参照してください。

接続方法

いよいよ本題です。

データベースと接続するためには、下記のように記載します。

database.go
package database

import (
	"fmt"
	"os"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var db *gorm.DB

func SetupDB() (err error) {
	connectInfo := fmt.Sprintf(
		"%s:%s@tcp(db)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		os.Getenv("DB_USER"),
		os.Getenv("DB_PASSWORD"),
		os.Getenv("DB_NAME"),
	)
	db, err = gorm.Open(mysql.Open(connectInfo), &gorm.Config{})
	if err != nil {
		return err
	}

	fmt.Println("Database connected!")
	return nil
}

まず、下記の部分でデータベースと接続するために接続情報を取得します。

connectInfo := fmt.Sprintf(
    "%s:%s@tcp(db)/%s?charset=utf8mb4&parseTime=True&loc=Local",
    os.Getenv("DB_USER"),
    os.Getenv("DB_PASSWORD"),
    os.Getenv("DB_NAME"),
)

注意しなければならないのは、tcp(db)の部分です。

()内にはデータベースのホストが入ります。

今回docker-compose.ymlでデータベース用のコンテナのservice名をdbに設定しているのでdbを入れればOKです。

もし、docker-compose.ymlcontainer_name(今回で言うとmysql)を設定している場合は、そちらでも設定できます。

上記のように設定できたら実行してみましょう。

実行する場合はgo runコマンドを使用しましょう。

実行するとターミナル上で下記のようになるはずです。

go: downloading gorm.io/driver/mysql v1.4.6
go: downloading gorm.io/gorm v1.24.5
go: downloading github.com/go-sql-driver/mysql v1.7.0
go: downloading github.com/jinzhu/now v1.1.5
go: downloading github.com/jinzhu/inflection v1.0.0
Database connected!

上記のようになれば成功です。

ただ念の為本当に接続できているかをpingコマンドで確認してみましょう。

docker compose run --rm api ping dbと入力します。(接続が確認できたらctrl+Cで止めましょう)

$ docker compose run --rm api ping db
[+] Running 1/0
 ⠿ Container mysql  Running                                                                                                                                                  0.0s
PING db (172.27.0.2): 56 data bytes
64 bytes from 172.27.0.2: seq=0 ttl=64 time=0.998 ms
64 bytes from 172.27.0.2: seq=1 ttl=64 time=0.458 ms
64 bytes from 172.27.0.2: seq=2 ttl=64 time=0.242 ms
64 bytes from 172.27.0.2: seq=3 ttl=64 time=0.241 ms
^C
--- db ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.241/0.484/0.998 ms

しっかりとパケットが届いていることが確認できます。

これで接続されたことが確認できました!

まとめ

いかがだったでしょうか。

接続自体はそれほど難しくなかったかなと思います。

今後、gormを利用して学習していくので使用方法などの記事も随時更新していこうと思います!

最後まで読んでいただきありがとうございました!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?