🌊
Go・GORM・Docker・MySQLでローカル開発環境を構築する
記事の内容
- GO
- GORM
- Docker
- MySQL
でローカル開発環境を構築します。
記事を読むと得られるもの
- 上記スタックでのローカル開発環境構築方法
記事の長さ
3分で読めます
GoのDocker開発環境を構築する
GoのDockerとdocker compose を使ったローカル開発環境構築は、以下の記事で解説しています。
この記事で作成した、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で配信しています。
Discussion