metabase(BIツール)で内部に作成したSQL情報はAPI経由で一括抽出できたのでサンプルコードを残します。
用途としては、特定文字列が入ってるmetabaseのカードを洗い出す場合に使います。
以下では、targetという文字列がmetabaseのカード内のSQLで利用しているカード情報を洗い出してます。
# インストール pip install metabase-api
# ライブラリのインポート from metabase_api import Metabase_API import pandas as pd
# Metabaseへのログイン情報を設定 METABASE_URL = 'https://xxxxxx.xxxxxxxxxx.com' # 自分の環境のMetabaseのURLを指定 EMAIL = 'xxxxxxxxxx@xxxx.com' # Metabaseのユーザー名(メールアドレス) PASSWORD = 'xxxxxxxxxx' # Metabaseのパスワード # Metabase APIに接続 mb = Metabase_API(METABASE_URL, EMAIL, PASSWORD) # すべてのカードを取得 cards = mb.get('/api/card') # 特定カードを指定する場合は、/api/card/xx →対象番号を指定すればOK # DataFrameに変換 cards_df = pd.DataFrame(cards)
# カード情報から必要情報を抽出(ここでは cardのid情報、cardの名称, cardの説明、SQLのコードを指定) target_df = cards_df[["id", "name", "description", "dataset_query" ]] # dataset_queryはjson項目の為、検索用にフラット化をする df_flat = pd.json_normalize(target_df['dataset_query']) # object型を文字列型に変換(object型のままだと、containsで文字列検索できないため) df_flat['native.query'] = df_flat['native.query'].astype(str) # フラット化後のデータフレームで利用している文字列を指定して検索 query_info = df_flat[df_flat['native.query'].str.contains('target')] # ここではtargetという文字列を指定 # インデックスをキーにマージ (共通するインデックスを持つ行のみ抽出) merged_df = pd.merge(target_df, query_info, left_index=True, right_index=True, how='inner') # 結果を出力 (必要項目のみを指定) result_df = merged_df[['id', 'name', 'description']] print(result_df)
- | id | name | description |
---|---|---|---|
1 | 123 | カード1 | None |
2 | 234 | カード2 | test用 |
3 | 345 | カード3 | None |