76592e4dc0
- .claude/settings.local.json - scratchpad/mbq.py Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
52 lines
1.5 KiB
Python
52 lines
1.5 KiB
Python
"""Helper: run SQL against Metabase BigQuery db=6 via REST API.
|
|
|
|
Usage:
|
|
python3 mbq.py "SELECT 1"
|
|
python3 mbq.py < query.sql
|
|
Reads API key from `pass metabase/aurgi-api-key`.
|
|
Prints columns header + rows as TSV.
|
|
"""
|
|
import os
|
|
import sys
|
|
import json
|
|
import subprocess
|
|
|
|
sys.path.insert(0, "python/functions")
|
|
from metabase import MetabaseClient, metabase_execute_query
|
|
|
|
MB_URL = "https://reports.autingo.es"
|
|
DB_ID = 6
|
|
|
|
|
|
def get_key():
|
|
return subprocess.check_output(["pass", "show", "metabase/aurgi-api-key"]).decode().splitlines()[0].strip()
|
|
|
|
|
|
def run(sql, max_results=2000):
|
|
import httpx
|
|
c = MetabaseClient(MB_URL, get_key())
|
|
try:
|
|
res = metabase_execute_query(c, DB_ID, sql, max_results=max_results)
|
|
except httpx.HTTPStatusError as e:
|
|
print("HTTP", e.response.status_code, e.response.text[:3000])
|
|
return
|
|
data = res.get("data", {})
|
|
cols = [col.get("display_name") or col.get("name") for col in data.get("cols", [])]
|
|
rows = data.get("rows", [])
|
|
# error?
|
|
if res.get("error") or (res.get("status") and res.get("status") != "completed"):
|
|
print("ERROR:", json.dumps(res.get("error") or res, ensure_ascii=False)[:2000])
|
|
return
|
|
print("\t".join(str(x) for x in cols))
|
|
for r in rows:
|
|
print("\t".join("" if v is None else str(v) for v in r))
|
|
print(f"-- {len(rows)} rows", file=sys.stderr)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if len(sys.argv) > 1:
|
|
sql = sys.argv[1]
|
|
else:
|
|
sql = sys.stdin.read()
|
|
run(sql)
|