日: 2019年4月4日

  • redash パラメータを動的に変えてクエリを実行する

    redash パラメータを動的に変えてクエリを実行する

    Notice!

    以下の記事で redash  のみで行う方法をまとめております。
    こちらの記事をご覧ください。

     

    https://tsukada.sumito.jp/2020/02/28/redash-api-query-parameter/

    はじめに(本記事はサードパーティを利用した方法です)

    redashはとても便利だが、パラメータを動的に変えてクエリを投げる様な事はオフィシャルにはできない

    しかし、それもサードパーティを利用し、少し手を加える事で実現可能になる。

    検証環境の構築

    サンプルをダウンロード

    サンプルのredashと、適当なデータが入ったmysqlをダウンロード

    git clone https://github.com/GitSumito/redash-blue

    セットアップ

    docker-compose run --rm server create_db docker-compose up

    http://localhost/setup

    へ接続するとセットアップ画面が表示されるので入力する

    ログインすると、右上のメニューから Edit Profile を選択する

    API keyが表示されるのでひかえる

    データソースにmysqlを追加する

    設定は以下の通り

     この時、保存した際のURLを確認する

    /data_sources/1 とある。

    これがデータソース番号となる。今回登録したデータソースは1番ということがこれでわかる。

    クエリを書く

    select * from city where CountryCode = "{{code}}"

    このクエリを書くと、下にテキストボックスが表示される

    これでExecuteボタンを押すと、where CountryCode = “JPN” が実施される

    クエリを保存すると、以下の様なURLになっている

    後ろにパラメータがついているがそれは無視すると、クエリ番号1番となっていることがわかる。

     

    /redash_client をインストールする

    https://github.com/mozilla/redash_client

    mozillaでredash clientというものが存在している。

    これを ariarijp さんが改修してくれていた。神!

    (今現在masterに取りこめられていないが、非常に便利な機能だ)

    差分が公開されているので、これを元にオリジナルのmozillaを一部改修する

    https://github.com/mozilla/redash_client/pull/70/files#diff-80f7450d3a8b47a2d0a622873d1a67fe

    これにより、動的クエリを受け付けることができるようになる

     

     

    from pprint import pprint
    
    import os
    import pystache
    
    from redash_client.client import RedashClient
    
    api_key = os.environ["REDASH_API_KEY"]
    
    client = RedashClient(api_key)
    client.BASE_URL = 'http://127.0.0.1/'
    client.API_BASE_URL = client.BASE_URL + 'api/'
    
    query = client.get_query(1)
    sql = pystache.render(query['query'], {
      'code': 'JPN',
    })
    
    result = client.get_query_results(sql, query['data_source_id'])
    
    pprint(result, width=160)

    その後、環境変数に

    REDASH_API_KEY

    をセットする

    export REDASH_API_KEY=*********************

    実行結果

    $ python3 mozilla.py 
    [{'CountryCode': 'JPN', 'District': 'Tokyo-to', 'ID': 1532, 'Name': 'Tokyo', 'Population': 7980230},
     {'CountryCode': 'JPN', 'District': 'Kanagawa', 'ID': 1533, 'Name': 'Jokohama [Yokohama]', 'Population': 3339594},
     {'CountryCode': 'JPN', 'District': 'Osaka', 'ID': 1534, 'Name': 'Osaka', 'Population': 2595674},
     {'CountryCode': 'JPN', 'District': 'Aichi', 'ID': 1535, 'Name': 'Nagoya', 'Population': 2154376},
     {'CountryCode': 'JPN', 'District': 'Hokkaido', 'ID': 1536, 'Name': 'Sapporo', 'Population': 1790886},
     {'CountryCode': 'JPN', 'District': 'Kyoto', 'ID': 1537, 'Name': 'Kioto', 'Population': 1461974},
     {'CountryCode': 'JPN', 'District': 'Hyogo', 'ID': 1538, 'Name': 'Kobe', 'Population': 1425139},

    scriptのcodeを変えて実行

    $ python3 mozilla.py 
    [{'CountryCode': 'USA', 'District': 'New York', 'ID': 3793, 'Name': 'New York', 'Population': 8008278},
     {'CountryCode': 'USA', 'District': 'California', 'ID': 3794, 'Name': 'Los Angeles', 'Population': 3694820},
     {'CountryCode': 'USA', 'District': 'Illinois', 'ID': 3795, 'Name': 'Chicago', 'Population': 2896016},
     {'CountryCode': 'USA', 'District': 'Texas', 'ID': 3796, 'Name': 'Houston', 'Population': 1953631},
     {'CountryCode': 'USA', 'District': 'Pennsylvania', 'ID': 3797, 'Name': 'Philadelphia', 'Population': 1517550},
     {'CountryCode': 'USA', 'District': 'Arizona', 'ID': 3798, 'Name': 'Phoenix', 'Population': 1321045},

    取得結果が変わった。

    色々活用できる場がありそうだ。