🦣

DBのテーブルスキーマをnotionの表にするパッケージを作った

2022/02/26に公開

https://github.com/maru44/scheman

これは何?

DB のテーブルスキーマをnotionのページに描画するツール(今後notion以外も対応予定)
雑な画像ですがコマンド一発でこんな感じの表がnotionに作成されます

イメージはこんな感じ

テーブル定義

https://github.com/maru44/scheman/blob/master/testdata/postgres/def.csv

ERD

https://github.com/maru44/scheman/blob/master/testdata/postgres/erd.md

非エンジニアのとエンジニアの協業を加速するためのものもの
熟したプロジェクトよりもアーリーなステージで活躍すると個人的には思ってる

エンジニアであればsql直で読んだり、DataGrip等を使えば問題ありませんが、そうでない方は表とかにしてあると楽ですよね
またローカル環境等を常に最新の状態に保つためにはgitで毎日pullしなければいけません。エンジニアにはなんら障壁になりませんが、非エンジニアの方からすれば結構大変。
かと言え表をマイグレーションごとに手動で直すのなんてもっと馬鹿らしい
定期的にもしくはマイグレーションの変更にフックして自動で更新したい!
そんな思いが込められてるやーつ

作った細かい経緯はこちらに記載

使い方

インストール

go install github.com/maru44/scheman@v1.2.1

設定ファイル

scheman.tomlファイルを作成

scheman.toml
attr-ignore = ["Auto Generate", "Comment"]

[psql]
  dbname  = "scheman"
  host    = "localhost"
  port    = 5432
  user    = "root"
  pass    = "password"
  sslmode = "disable"
  schema  = "public"
  blacklist = ["multi_pks", ]

そして以下のようにSQLBoilerのドライバーをインストールしつつ、実行

go install github.com/volatiletech/sqlboiler/v4/drivers/sqlboiler-psql@v4.8.6 \
    && scheman psql \
    --notion-token ${NOTION_TOKEN} --notion-page-id ${PSQL_NOTION_PAGE_ID}

notion-tokenには Notion のインテグレーショントークンを、notion-page-idにはテーブルの定義を表示した Notion のページの uuidの部分 を入れる

インテグレーショントークンはここで発行
https://www.notion.so/my-integrations

uuidの部分というのはhttps://www.notion.so/PostgreSQL-test-9c822222e468*******************でいうとページのタイトルを抜いた9c822222e468*******************の部分

SQLBoilerを既に使っていてsqlboiler.toml等のコンフィグファイルが既にある場合は-cもしくは--conifgオプションを使うことでそのまま流用可能

例 (sqlboiler.toml)
scheman psql -c './sqlboiler.toml' \
    --notion-token ${NOTION_TOKEN} --notion-page-id ${PSQL_NOTION_PAGE_ID}

オプション

disable-views
trueにするとviewは表示しない。bool

attr-ignore
無視する表の項目。文字列の配列。Data Type, Default, PK, Auto Generate, Unique, Null, Enum, Comment, Free Entryから複数選択 (Free Entryは自由記述欄で notion 上で手動で更新たものが次回以降も引き継がれる)

<driver_name>.blacklist
<driver_name>.whitelist
ブラックリスト、ホワイトリスト形式でテーブルの表示、非表示を変えられる。文字列の配列。

仕組み

Notion

notion に表として出力する部分は抽象化してあるため今後スプレッドシート等出力先のバリエーションを増やすことになっても簡単に対応できる。
notion のクライアントとしてはリバースプロキシするタイプのものは避けたかったので以下のものを選択
notion の api は自由度を担保するためなのか少しデータ構造が複雑なためnet/http でやるのは個人的にはあまりおすすめしない
https://github.com/dstotijn/go-notion

DB

DB の情報を取得する部分は SQLBoiler に丸投げした。
理由としては作るのにあまり時間をかけたくなかったので、既にあるものを使った方が早いのではないかと考えたから。
そのため SQLBoiler への依存が半端なく柔軟性はないが、ここの部分はより柔軟にしなければいけなくなったら自分で実装すればいいやと思っている。今のところ SQLBoiler 依存で全く問題ない。
https://github.com/volatiletech/sqlboiler

CLI

CLI の部分は SQLBoiler に倣って viper🐍 と cobra🐍 の組み合わせを使った (それはまぎれもなくヤツさ こーぶらーふふふふーん ♪)
普段はこういうのあんまり使わないけど、go に入っては go に従えである
何となーく使ってみたけど著者が同じだけにこの二つの組み合わせは強力だと感じた (ヒューッ!)
https://github.com/spf13/viper
https://github.com/spf13/cobra

作るに至った経緯

現職で最新のデータ構造が簡単に知れると仕事が捗るという要望があった(非エンジニアの方々から)
そこで notion のページにデータ構造が把握できるページを作った上で、それを github actions で定時実行なり、マイグレーションファイルに変更があるたびに自動で更新できるような機能を作ろうということになった

タスクがアサインされるも、他の売り上げに直結するであろう機能開発のタスクが舞い降りる
まだ本当に超アーリーなステージなためこういう顧客の欲求とは直接関係ないタスクはどうしても後回しになってしまう。これは仕方ないし、より難解で今後の核となる部分が開発できて楽しかったので文句は全くないし、寧ろ最高だった

そんなこんなでこのタスクの存在を完全に忘れかけていた時に github projects の隅っこで埃をかぶって横たわるこのタスクがふと視界に入った
そこで妙案を思いついた

CTO に「このタスク自分に個人的にください。現在のプロダクトに限らず汎用的に使えそうなので OSS にしたいです。」と相談した
会社のタスクを自分の手柄にしようだなんて流石は自称 7 つの大罪の落とし子 (今度からまる・スノウとでも呼んでください )、欲望の塊である。我田引水も甚だしい 🌾
そんな卑しい自分とは裏腹に CTO は快諾してくれて、寧ろ感謝さえしてくれた

会社の手元を離れて開発したので業務で書くコードと比較して質はかなり下がるがとりあえず汎用的に動くものができた

よかったら使って下さい
自分で言うのもなんですが、結構便利

今後

  • SQLServerSQLite3の動作確認 (個人的に使う予定がないから正直やりたくない。欲しい人がいたらissue作ってあるのでスタンプを押して貰えると需要がわかるのでありがたいです)
  • test 書く (一旦横着して手動テストしかしていない (個人開発の特権))
  • 出力先を増やす (スプレッドシートとか)
GitHubで編集を提案

Discussion