🌊

Go・GORM・Docker・MySQLでローカル開発環境を構築する

2023/12/02に公開

記事の内容

  • GO
  • GORM
  • Docker
  • MySQL

でローカル開発環境を構築します。

記事を読むと得られるもの

  • 上記スタックでのローカル開発環境構築方法

記事の長さ

3分で読めます

GoのDocker開発環境を構築する

GoのDockerとdocker compose を使ったローカル開発環境構築は、以下の記事で解説しています。

https://zenn.dev/ring_belle/articles/go-docker-air-local

この記事で作成した、GoのDocker開発環境に追加していく形で、GormとMySQLの環境を構築していきます。

docker composeにMySQLを追加する

docker-compose.yml

version: "3.9"
services:
  go:
    build: .
    ports:
      - "8080:8080"
    volumes:
      - .:/app
  mysql:
    image: mysql:8.0.29
    platform: linux/amd64
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      MYSQL_DATABASE: first
    volumes:
      - db-vol:/var/lib/mysql
    ports:
      - "3306:3306"
volumes:
  db-vol:

MySQLコンテナに関する記述を追加したdocker-compose.yamlファイルです。

上記ファイルを準備したら、docker compose upコマンドを実行して、MySQLコンテナが正常に起動するか確かめます。

$ docker compose up
o-project-go-1     |
go-project-go-1     |   __    _   ___
go-project-go-1     |  / /\  | | | |_)
go-project-go-1     | /_/--\ |_| |_| \_ v1.49.0, built with Go go1.21.3
...
go-project-mysql-1  | 2023-12-02T01:08:16.836041Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock

上記のように、MySQLコンテナが立ち上がったら、以下のdockerコマンドで、正常に起動していることを確認します。

$ docker container ls
CONTAINER ID   IMAGE                 COMMAND                  CREATED             STATUS          PORTS                                NAMES
d9fadc44df70   mysql:8.0.29          "docker-entrypoint.s…"   49 seconds ago      Up 48 seconds   0.0.0.0:3306->3306/tcp, 33060/tcp    go-project-mysql-1
1ad463263ca5   go-project-go         "air"                    About an hour ago   Up 48 seconds   0.0.0.0:8080->8080/tcp               go-project-go-1

上記のように、コンテナが2台立ち上がっていたら、正常に起動されている証拠です。

MySQLに接続してみる

ローカル環境から以下のコマンドで正常にMySQLに接続できることを確認してください。

$ mysql -uroot -P 33306
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.29 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>

Gormを導入する

MySQLコンテナの準備が整いましたので、Gormを導入します。

まずは、gormとmysqlドライバーをgo getします。

$ go get -u gorm.io/gorm
go: added github.com/jinzhu/inflection v1.0.0
go: added github.com/jinzhu/now v1.1.5
go: added gorm.io/gorm v1.25.5

$ go get -u gorm.io/driver/mysql
go: downloading gorm.io/driver/mysql v1.5.2
go: downloading github.com/go-sql-driver/mysql v1.7.0
go: added github.com/go-sql-driver/mysql v1.7.1
go: added gorm.io/driver/mysql v1.5.2

次に、今インストールしたモジュールを利用して、main.goファイルからMySQLに接続します。

main.go

package main

import (
  "fmt"
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

type Product struct {
  gorm.Model
  Code  string
  Price uint
}

func main() {
  dsn := "root@tcp(mysql:3306)/first?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  if err != nil {
    panic("failed to connect database")
  }

  // Migrate the schema
  db.AutoMigrate(&Product{})

  // Create
  db.Create(&Product{Code: "D42", Price: 100})

  var product Product
  db.First(&product, "code = ?", "D42") // find product with code D42
  fmt.Println(product)
}

上記のようにmain.goを編集して、保存します。Airが導入されているので自動でGoのbuildが再実行され、docker composeのログに以下のようにレコードの結果が表示されます。

go-project-go-1     | building...
go-project-go-1     | running...
go-project-go-1     | {{2 2023-12-02 01:37:15.503 +0000 UTC 2023-12-02 01:37:15.503 +0000 UTC {0001-01-01 00:00:00 +0000 UTC false}} D42 100}

これで、Gormを使ってMySQLに対してレコードの作成と、読み取りができました。

note

勉強法やキャリア構築法など、エンジニアに役立つ記事をnoteで配信しています。

https://note.com/ring_belle/membership

Discussion