LoginSignup
6
4

More than 5 years have passed since last update.

tbls と grom を使ってCI環境内でDBテーブル設計書を自動作成する

Posted at

やりたいこと

  • CIでDBのテーブル設計書を自動で作成したい

実現方法

tbls という対象のDBにアクセスしてMarkdownのドキュメントを自動で生成するツールを使います。

実際の流れとしては、以下のようになります。

  1. CI環境でDBのコンテナを起動
  2. golang ORM gormの オートマイグレート機能で、golangのstructから、自動でテーブルを作成
  3. tbls でDBのコンテナにアクセスし、ドキュメントを自動生成

実際の構成

プロダクトコードのリポジトリ内に以下のようなソースファイルを用意します。
このコードは、プロダクトコードの中で普通に利用されるModelでもあります。

github.com/xxxx/product/models/user.go
package models

import (
    "github.com/jinzhu/gorm"
)

type User struct {
    gorm.Model

    Name         string `gorm:"type:varchar(32)"`
    MailAddress  string `gorm:"type:varchar(255)"`
    Age          int    `gorm:"type:int(11)"`
}

ドキュメントを管理するリポジトリ内に以下のようなソースファイルを用意します。
今回はMySQLを利用してますが、 tbls はPostgreSQLやsqliteにも対応しています。

github.com/xxxx/product/main.go
package main

import (
    "fmt"
    "os"

    "github.com/jinzhu/gorm"
    // MySQL driver
    _ "github.com/go-sql-driver/mysql"

    "github.com/xxxx/product/models"
)

func main() {
    dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8",
        os.Getenv("MYSQL_USER"),
        os.Getenv("MYSQL_PASSWORD"),
        "mysql",
        "3306",
        os.Getenv("MYSQL_DATABASE"),
    )

    dbCon, err := gorm.Open("mysql", dsn)
    if err != nil {
        println(err.Error())
        os.Exit(1)
    }

    dbCon.AutoMigrate(&models.User{})
    println("Done.")
    return
}

CI環境内で上記の main.go を実行してあげるだけでDBコンテナに自動でテーブルが作成されるので、
以下のように CI環境内で tbls を実行するだけでドキュメントが自動生成されます。
生成されたドキュメントは、マークダウンなのでそのままgithubにコミットして管理することができます。

script:
  - go run main.go
  - tbls doc --force mysql://${MYSQL_USER}:${MYSQL_PASSWORD}@mysql/${MYSQL_DATABASE} ./docs

まとめ

これだけの設定で、実際のプロダクトコードで管理しているgolangのModelが変更されると自動でテーブル設計書も更新するということができました。
tbls については、以下のページに更に詳しく書かれています。

6
4
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
6
4