はじめに
SQL Lineageという言葉をご存じでしょうか。
"リネージュ"か"リネージ"か日本語特有の問題が出ますが、とりあえず私は"リネージ"でいきます。
英単語のlineageは、系統とか血統という意味です。ゲームで20年以上前から、リネージュというのがありますが、同じ単語です。
スペルが難しいので私は、"LINE"と"AGE"が組み合わさって、祖先にさかのぼる系統図の線をイメージして覚えてます。
さてそのリネージですが、SQLと合わせて、SQL Lineageというものがあります。with句を使ったりした複雑なSQLで、最終的なselectで使う列って、おおもとはどこから来てるんだっけ?というのを図示するものです。
テーブル単位だけでなく、列単位で、どこから来ているのか知りたくなります。カラムレベルリネージと言われます。
そのツールはいくつか出てるのですが、使い勝手とか、機能過多とか、見た目とかでしっくりこなさすぎるので、作ってみることにしました。有償のサービスもあるけど、これそんなに難しい話じゃなくない?という安易な考えもあり。
要件・技術
- クライアント
- 要件:ブラウザで動く
- 技術:React
- サーバー
- 要件:どこかのPaaSで動くREST API
- 技術:Node.jsのexpress
開発開始時の私のスキル
- フロントエンド開発経験
- 仕事ではなし
- プライベートの独学のみ
- JavaScriptは昔から触っていて好き
- サーバー開発経験
- REST APIの設計・開発は、pythonで経験あり
- Node関係
- Node.jsは独学
- React、expressともに初
- ※いつかしっかりやってみたかった思いはずっとあった
作ってみた(現時点。初期)
入れたクエリ
with t_a1 as (
select
id,
col1 as col_a1
from
t_a
)
select
t_a1.id,
t_a1.col_a1,
t_b.coll_b
from
t_a1,
t_b
モチベアップのために、リネージの部分を先行して実装しました!
Lineage なのか visualizer なのか viewer なのか、ブレすぎてることに今気づきました!
インフラ面
クライアントはGAE、サーバーはRenderに置いてあります。いずれも無料枠。
Renderは無料だと15分くらいでspin downしてしまい、その後起動に数分(!)かかります。一度起動すれば速いんですが、最初だけお待ちください。
F12のコンソールで、クエリが出た後に何もなくじっとしてるときは、サーバーを待ってます。
コード
3つのリポジトリを使っています。
1. クライアント
Reactのアプリです。
これをGAEに置いています。
2. APIサーバー
expressで作ってます。
これをRenderに置いています。
CORSの設定に割と躓きましたが、なんとかクリア。
3. SQLパーサー
expressで使っているnode moduleです。githubにアップして、expressではgithubから読みこむ形。npmへの公開は、汎用的でないので不要と思ってます。
この中でさらに、taozhi8833998/node-sql-parser を使ってます。私のモジュールは、この機械的なパーサーの結果を読み解いて、クライアントで使う目的に合わせて、加工したり情報を落としたりしてます。
今後アップデート内容
いまのところ、上の方が優先度高。
- コンパネ対応(緑のところ)
- テーブル間の線の表示/非表示のチェックボックス
- 列間の線の表示/非表示のチェックボックス
- DBの方言対応(今はハードコーディングでBigQueryです。)
- マウス操作で全体の移動、拡大/縮小
- テーブルか列のクリック or マウスホバーで、その系統を強調
- 文字サイズやスペースの調整ができる機能
- エクスポート機能
- クリップボード(Officeに貼り付けられる形だと嬉しいが、技術はまだ不明)
- SQLファイルをドロップしたら読む対応
- where句の対応(どう表現するか未定)
- エラーハンドリング
- 複数のSQLファイルを混在
- デザイン、見た目
- インフラ整備
- Renderが休まない仕組み? or 有償化
- 引っ越し、k8s化
- ログイン機能
- 過去のクエリの保存、呼び出し
- 課金機能
- 保存
- エクスポート機能?
- 随時、クエリのテストとデバッグ
たっぷりありますね・・・。
最終的な姿は、ログインせずとも大体使えるけど、保存とかエクスポートのプラスアルファ機能を課金に持っていけたらって思ってます!
または特定の企業向けのクローズドなシステムとして、他のシステムと結合したり。
おわりに
ボロボロだろうがなんだろうが、早く第一弾をリリースしたかったんですが、時間がかかってしまいました。ようやく簡単なクエリなら動くようになりました。
触ってみていただけたら嬉しいです!
もろもろの機能要望、アドバイス、バグ報告、応援等、なんでもコメントでいただけるとありがたいです!📣
よろしくお願いします!