Posted at

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

More than 1 year has passed since last update.


やりたいこと


  • 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 については、以下のページに更に詳しく書かれています。

https://k1low.hatenablog.com/entry/2018/05/22/083000