redash に対してpsqlみたいにSQL投げられるCLI作ってみた
こんにちは。LAPRASでデータ分析の責務を担当しているdenzowです。
この記事は、LAPRAS Advent Calendar 2020 10日目の記事です。オレが書いたときが10日目です。
5日目 ではテクニカルサポート担当でしたが、LAPRASは責務が流動的で一人が様々な責務を担うので、私は開発者以外にテクサポとデータ分析をやっています。
LAPRASのデータ分析
LAPRASでは今のところredash をAWS上に構築してデータ分析に活用しています。分析対象は基本的にはLAPRAS SCOUTやLAPRASのRDBMSですが、スプレッドシートやAWS Athena、Google Analyticsもデータソースにしています。
redashではRDBMS以外のデータソースを分析できる上に、それらを横断した(異種のデータソース間でのJOIN)クエリを実行できるので大いに活用しています。
※異種データソース間のJOINはそれなりに痛みも伴いますが…
redashでのクエリ作成
redashでクエリを作成する場合、こんな感じの画面になります。
左のサイドパネルにデータソースの選択やそこで利用できるスキーマの一覧等が表示され、右にクエリを書いて実行その下に結果がでるという流れで行います。SQL入力中はスキーマ名や予約後等の補完も効きますので、ブラウザ上でも十分SQLは書けます。
それでもcliが好き
普通にSQLを書く分には十分すぎる機能があるのですが、私はDBAだった背景がありSQLとはCLIで書く物という刷り込みがなされています。
OracleのSQLPLUS,MySQLのmysqlコマンド、PostgreSQLのpsql等どれも気軽に起動でき、困らない程度の機能が入っているので使い込むと手に馴染みます。なのでredash上のクエリを書くときもできればターミナル上でやりたいのです。特に最高のSQL用CLI(個人の感想です)であるpsqlのようなツールがあればと日々思っておりました。
redaql
そんな思いが詰まったredaqlを作りました。作ったと言っても、前から欲しかった物をこのアドベントカレンダー用に突貫工事しただけなのでまだ最低限の機能しかありません。
- psqlライクな見た目
-
\c data_source_name
でDBを切り替えるようにデータソースを切り替えられる - SQL作成中の入力補完
なんとなくpsqlみを感じる挙動になっているかと思います。そのうち起動引数で接続パラメータ等を取りますが、現在は以下の環境変数より雪辱情報を取得しています。
export REDASH_API_KEY=XXXXX
export REDASH_SERVICE_URL=XXXXX
export REDASH_HTTP_PROXY=必要に応じて
redash_py
redaqlはredashのAPIを通じてデータソースの一覧やスキーマ情報、アドホックなクエリ実行を行っています。確認する限りRedashのAPIに対応するPythonClientは存在しなかったので作りました。
Redashが備えるAPIのうち、必要になったものしか実装していませんので今後埋めていきたいと思っています。一応redash自体のAPIガイドはここ にありますが、明らかに乗ってないAPIも多いです。
APIに対応するredash自体のコードはここですので、ソースを読むと意外とこんなAPIもあるんだ!みたいな感じでだいたいやりたいことは見つかります。
https://github.com/getredash/redash/blob/master/redash/handlers/api.py
まとめ
とりあえずまだredaqlは作ったばかりでちゃんと運用できてないので自分で使いながら今後も整えていきます。また来年のアドベントカレンダーにはスペシャルになったredaqlの話をさせていただきます。
Author And Source
この問題について(redash に対してpsqlみたいにSQL投げられるCLI作ってみた), 我々は、より多くの情報をここで見つけました https://qiita.com/denzow/items/e542fb07a2e7ff98ea03著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .