MyDocs

# sql-migrateを試す

https://github.com/rubenv/sql-migrate を試してみた。

docker で試す

通常のアプリを起動する docker-compose.yml とは別に docker-compose.migration.yml を用意した。

version: '3'
services:
  db:
    build:
      context: ./docker/database
    restart: always
    environment:
      MYSQL_DATABASE: app
      MYSQL_USER: user
      MYSQL_PASSWORD: pass
      MYSQL_ROOT_PASSWORD: pass
    ports:
      - 3306:3306
    volumes:
      - ./docker/database/mysql:/var/lib/mysql
  migration:
    build:
      context: ./docker/migration
    volumes:
      - ./migrations:/work
    depends_on:
      - db

migration 用の Dockerfile はこんな感じ。

FROM golang:1.17.3

WORKDIR /work
RUN go get -v github.com/rubenv/sql-migrate/...

migration コンテナにマウントしてる ./migrations にはマイグレーション用の SQL と dbconfig.yml を置いている。

dbconfig.yml では接続する DB の設定を書いておく。

development:
    dialect: mysql
    datasource: user:pass@tcp(db:3306)/app?parseTime=true
    dir: .

また sql ファイルには -- +migrate Up-- +migrate Down の記述が必要。

-- +migrate Up
CREATE TABLE topics (
  id varchar(255),
  title varchar(255),
  detail varchar(255)
);

-- +migrate Down
DROP TABLE IF EXISTS topics;

実行

$ docker-compose -f docker-compose.migration.yml run migration bash
$ sql-migrate up