Help us understand the problem. What is going on with this article?

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

fuku2014
お気に入り swift 使える javascript php 書いたことはある pascal vb objective-c golang 興味ある python 苦手 java
fjct
クラウド・IoT 関連サービスを開発・提供している企業です。(こちらは、富士通クラウドテクノロジーズの有志にて運営しております。)
https://fjct.fujitsu.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away