LoginSignup
2
0

SQLLineageを作ってみた(ベータ版リリース🎁)

Last updated at Posted at 2024-03-21

はじめに :writing_hand:

SQL Lineageという言葉をご存じでしょうか。

"リネージュ"か"リネージ"か日本語特有の問題が出ますが、とりあえず私は"リネージ"でいきます。
英単語のlineageは、系統とか血統という意味です。ゲームで20年以上前から、リネージュというのがありますが、同じ単語です。
スペルが難しいので私は、"LINE"と"AGE"が組み合わさって、祖先にさかのぼる系統図の線をイメージして覚えてます。

さてそのリネージですが、SQLと合わせて、SQL Lineageというものがあります。with句を使ったりした複雑なSQLで、最終的なselectで使う列って、おおもとはどこから来てるんだっけ?というのを図示するものです。

テーブル単位だけでなく、列単位で、どこから来ているのか知りたくなります。カラムレベルリネージと言われます。

そのツールはいくつか出てるのですが、使い勝手とか、機能過多とか、見た目とかでしっくりこなさすぎるので、作ってみることにしました。有償のサービスもあるけど、これそんなに難しい話じゃなくない?という安易な考えもあり。

要件・技術 :point_up:

  • クライアント
    • 要件:ブラウザで動く
    • 技術:React
  • サーバー
    • 要件:どこかのPaaSで動くREST API
    • 技術:Node.jsのexpress

開発開始時の私のスキル :thinking:

  • フロントエンド開発経験
    • 仕事ではなし
    • プライベートの独学のみ
    • JavaScriptは昔から触っていて好き
  • サーバー開発経験
    • REST APIの設計・開発は、pythonで経験あり
  • Node関係
    • Node.jsは独学
    • React、expressともに初
      • ※いつかしっかりやってみたかった思いはずっとあった

作ってみた(現時点。初期):confetti_ball:

image.png

入れたクエリ

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 なのか、ブレすぎてることに今気づきました!:laughing:

インフラ面 :level_slider:

クライアントはGAE、サーバーはRenderに置いてあります。いずれも無料枠。

Renderは無料だと15分くらいでspin downしてしまい、その後起動に数分(!)かかります。一度起動すれば速いんですが、最初だけお待ちください。:bow:
F12のコンソールで、クエリが出た後に何もなくじっとしてるときは、サーバーを待ってます。

コード :page_with_curl:

3つのリポジトリを使っています。

1. クライアント

Reactのアプリです。
これをGAEに置いています。

2. APIサーバー

expressで作ってます。
これをRenderに置いています。
CORSの設定に割と躓きましたが、なんとかクリア。

3. SQLパーサー

expressで使っているnode moduleです。githubにアップして、expressではgithubから読みこむ形。npmへの公開は、汎用的でないので不要と思ってます。

この中でさらに、taozhi8833998/node-sql-parser を使ってます。私のモジュールは、この機械的なパーサーの結果を読み解いて、クライアントで使う目的に合わせて、加工したり情報を落としたりしてます。

今後アップデート内容:construction_worker:

いまのところ、上の方が優先度高。

  • コンパネ対応(緑のところ)
    • テーブル間の線の表示/非表示のチェックボックス
    • 列間の線の表示/非表示のチェックボックス
    • DBの方言対応(今はハードコーディングでBigQueryです。)
    • マウス操作で全体の移動、拡大/縮小
    • テーブルか列のクリック or マウスホバーで、その系統を強調
    • 文字サイズやスペースの調整ができる機能
    • エクスポート機能
      • PDF
      • クリップボード(Officeに貼り付けられる形だと嬉しいが、技術はまだ不明)
  • SQLファイルをドロップしたら読む対応
  • where句の対応(どう表現するか未定)
  • エラーハンドリング
  • 複数のSQLファイルを混在
  • デザイン、見た目
  • インフラ整備
    • Renderが休まない仕組み? or 有償化
    • 引っ越し、k8s化
  • ログイン機能
    • 過去のクエリの保存、呼び出し
  • 課金機能
    • 保存
    • エクスポート機能?
  • 随時、クエリのテストとデバッグ

たっぷりありますね・・・。:skull:

最終的な姿は、ログインせずとも大体使えるけど、保存とかエクスポートのプラスアルファ機能を課金に持っていけたらって思ってます!:money_mouth:
または特定の企業向けのクローズドなシステムとして、他のシステムと結合したり。

おわりに :grinning:

ボロボロだろうがなんだろうが、早く第一弾をリリースしたかったんですが、時間がかかってしまいました。ようやく簡単なクエリなら動くようになりました。
触ってみていただけたら嬉しいです!

もろもろの機能要望、アドバイス、バグ報告、応援等、なんでもコメントでいただけるとありがたいです!:grinning:📣

よろしくお願いします!

2
0
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
2
0