👻

Redash で Python を使う

2023/04/14に公開

この記事を読んで分かること

Redash のクエリの代わりに Python を使い、データを集計して表にして出力する方法。その際の注意点

テンプレート

最終的にテンプレートとして使えるコード。今後はこれを Fork して使っていく。以下、この解説。コードはこの3つの構成に分かれる

項目 やっていること
get_columns 列の定義。列名や型を定義する
get_rows 表示するデータを取得する
result データを実際に Redsah で表示する
テンプレート
def get_columns():
    return [
        [ 'column_name1', 'friendly_name1', TYPE_STRING ],
        [ 'column_name2', 'friendly_name2', TYPE_INTEGER ],
        [ 'column_name3', 'friendly_name3', TYPE_FLOAT ],
        [ 'column_name4', 'friendly_name4', TYPE_BOOLEAN ],
        [ 'column_name5', 'friendly_name5', TYPE_DATE ],
        [ 'column_name6', 'friendly_name6', TYPE_DATETIME ]
    ]

def get_rows():
    rows = []
    query = 'select id from users'
    for row in execute_query(1, query)['rows']:
        rows.append({
            'column_name2': row['id']
        })
    return rows

result = {}
columns = get_columns()
rows = get_rows()
for column in columns:
    add_result_column(result, column[0], column[1], column[2])
for row in rows:
    data = {}
    for column in columns:
        column_name = column[0]
        if column_name not in row:
            continue
        data[column_name] = row[column_name]
    add_result_row(result, data)

get_columns

列の定義。Redash で表を作る際は add_result_column を使って列を定義する。引数は、それぞれ結果の格納先、列名、表示名、型。ただし表示名はこのままでは使用されない

add_result_column
add_result_column(result, column_name, friendly_name, type)

後々この形式で使えるように、列を定義する配列を作る

get_columns
def get_columns():
    return [
        [ 'column_name1', 'friendly_name1', TYPE_STRING ],
        [ 'column_name2', 'friendly_name2', TYPE_INTEGER ],
        [ 'column_name3', 'friendly_name3', TYPE_FLOAT ],
        [ 'column_name4', 'friendly_name4', TYPE_BOOLEAN ],
        [ 'column_name5', 'friendly_name5', TYPE_DATE ],
        [ 'column_name6', 'friendly_name6', TYPE_DATETIME ]
    ]

使用できる型は以下の通り

ENUM 意味
TYPE_STRING 文字列
TYPE_INTEGER 数字
TYPE_FLOAT 小数点
TYPE_BOOLEAN True / False
TYPE_DATE 日付
TYPE_DATETIME 日時

get_rows

Redash のデータソースを使ってクエリを発行し、それを表で使える形式に変換する。Redsah では execute_query(data_source_id, query) を使うことで設定したデータソースに対してクエリを発行することができる。結果は 'rows' の中に格納されるため、それを for 文で取得し、配列に格納しておく

後々使いやすいように列名と合わせてデータを格納しておく

get_rows
def get_rows():
    rows = []
    query = 'select id from users'
    for row in execute_query(1, query)['rows']:
        rows.append({
            'column_name2': row['id']
        })
    return rows

result

最後に、取得した columns と rows を表敬式で出力する。add_result_row を使うと取得した rows を表に当てはめていくことができる

result
result = {}
columns = get_columns()
rows = get_rows()
for column in columns:
    add_result_column(result, column[0], column[1], column[2])
for row in rows:
    data = {}
    for column in columns:
        column_name = column[0]
        if column_name not in row:
            continue
        data[column_name] = row[column_name]
    add_result_row(result, data)

注意点

It seems like we encountered an error. Try refreshing this page or contact your administrator.

カラムだけ定義してデータがない状態で実行するとこのようなエラーになる。一度こうなると再実行することもできず、書いたコードを見返すこともできないため要注意。コードを取り出すには、Redash のデータベースに接続するしかないと思われる

READYFORテックブログ

Discussion