こんにちは、KOUKIです。
前回、Go言語のフレームワークであるfiberをDocker環境上で動かす方法を記事にしました。
今回は、MySQLを導入してみたいと思います。
尚、この記事に出てくるソースコードは、Udemyの「React, NextJS and Golang: A Rapid Guide – Advanced」コースを参考にしています。解釈は私が勝手に付けているので、本物をみたい場合は受講をお勧めします!
前回
事前準備
MySQLへ接続するために、Go言語のGORMを使います。そのためのモジュールをインストールしておきましょう。
1 2 |
go get -u gorm.io/gorm go get -u gorm.io/driver/mysql |
また、以下のフォルダ/ファイルも作成してください。
1 2 3 4 |
mkdir -p src/database touch src/database/db.go mkdir src/models touch src/models/user.go |
MySQLの導入
早速、MySQLを導入しましょう。
docker-compose.yml
前回作成したdocker-compose.ymlにdbサービスを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
version: "3.3" services: backend: ... # dbを先に起動させる # ただし、初回起動時はDBの準備に手間取るので、コネクトに失敗する # 可能性がある depends_on: - db db: image: mysql:5.7.22 # restart: always environment: MYSQL_DATABASE: ambassador MYSQL_USER: admin MYSQL_PASSWORD: admin MYSQL_ROOT_PASSWORD: root # ローカルに.dbdataを作成し、dbコンテナとFSをマウントする volumes: - .dbdata:/var/lib/mysql ports: - 33066:3306 |
environmentには、DBの情報を記述しています。dbサービスを起動するとambassadorデータベース、adminユーザー、adminユーザーのパスワード、rootユーザーのパスワードが自動生成されます。
また、DBの情報は、ローカルのカレントフォルダ(.dbdata)上で共有しました。volumesを使うとファイルシステムを簡単にマウントすることができます。※.dbdataフォルダはDockerコンテナ立ち上げ時に自動で作成されます
DB接続
Go言語からMySQLへアクセスしてみましょう。こちらを参考にしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package main import ( "github.com/gofiber/fiber/v2" "gorm.io/driver/mysql" "gorm.io/gorm" ) const ( // ユーザー:パスワード@tcp(dockerのサービス名(db):port)/db名 dsn = "admin:admin@tcp(db:3306)/ambassador?charset=utf8mb4&parseTime=True&loc=Local" ) func main() { // mysqlへアクセス _, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("Fail to connect mysql!") } ... app.Listen(":3000") } |
gormのOpenメソッドを使えば、簡単にMySQL(dbサービス)へアクセスできます。
起動確認
起動してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 1度目は接続失敗 docker-compose up go-admin_backend_1 exited with code 1 # 2度目はOK backend_1 | backend_1 | backend_1 | │ Fiber v2.11.0 │ backend_1 | │ http://127.0.0.1:3000 │ backend_1 | │ (bound on host 0.0.0.0 and port 3000) │ backend_1 | │ │ backend_1 | │ Handlers ............. 2 Processes ........... 1 │ backend_1 | │ Prefork ....... Disabled PID ............... 216 │ backend_1 | backend_1 | |
1度目の起動時は、接続に失敗すると思います。初回起動時のみ、MySQLはDB等を作成するので起動が遅いのです。
しかし、2回目以降は問題なく接続できます。
接続に失敗した場合、backendサービスは停止するので、ブラウザから「http://localhost:8000」へアクセスしても何も表示されません。逆に表示された場合は、問題なく動作しているということになります。

VS Codeのプラグイン
蛇足ですが、VS CodeのMYSQLプラグインを入れてみました。

- Host -> localhost
- Port -> 33066(dbサービスに設定したport)
- Username -> admin(dbサービスのMYSQL_USER)
- Password -> admin(dbサービスに設定したMYSQL_PASSWORD)
- Databases -> ambassador
上記の接続情報を入力して「Connect」ボタンを押下します。もちろん、dbサービスが動いている前提です。

ConnectができるとVsCodeからDBのスキーマーやデータなどが確認できるようになるので、大変便利です。まだテーブルを作成していないので大した情報は見れませんが、以降の記事でたびたび紹介します。

マイグレーション
gormには、Goの構造体からDBのスキーマーを自動生成するマイグレーション機能があります。
docker コンテナを立ち上げるだけで、マイグレーションが実行されるようにします。
models/user.go
このファイルには、データベースのスキーマーの元となるユーザー構造体を記述します。
1 2 3 4 5 6 7 8 9 10 11 |
// models/user.go package models type User struct { ID uint FirstName string LastName string Email string Password []byte IsAmbassdor bool } |
database/db.go
ここには、DBへコネクションを貼ったり、マイグレーションを実行する関数を実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// database/db.go package database import ( "admin/src/models" "gorm.io/driver/mysql" "gorm.io/gorm" ) const ( // ユーザー:パスワード@tcp(dockerのサービス名(db):port)/db名 dsn = "admin:admin@tcp(db:3306)/ambassador?charset=utf8mb4&parseTime=True&loc=Local" ) var DB *gorm.DB func Connect() { var err error DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("Could not connect with the database!") } } func AutoMigrate() { // User構造体に沿ってテーブルのスキーマーを作成する DB.AutoMigrate(models.User{}) } |
main.go
main.goからConnect関数及びAutoMigrate関数を呼び出しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
package main import ( "admin/src/database" "github.com/gofiber/fiber/v2" ) func main() { // Connection To Mysql database.Connect() // Migration database.AutoMigrate() // fiber API app := fiber.New() app.Get("/", func(c *fiber.Ctx) error { return c.SendString("Hello, World 👋!") }) app.Listen(":3000") } |
起動確認
docker コンテナを立ち上げ直すとマイグレーションが実行されるはずです。
1 2 3 4 |
# Ctrl + cでコンテナを止める # コンテナ立ち上げ docker-compose up |
MySQLツールで、スキーマーが作成されたか確認してみましょう。

OKですね。
次回
次回は、Live Reloading機能を実装しましょう。
コメントを残す
コメントを投稿するにはログインしてください。