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)
-idnamedescription
1123カード1None
2234カード2test用
3345カード3None
おすすめの記事