LookerSDKを使ってローカル環境からSQLを実行してみた

## やったこと
- ローカル環境からLookerAPIを使ってSQLを流して結果を受け取る

## 背景
- データ分析をする際にいちいちcsvダウンロードするのはちょっとだるいので作業が生まれる前に消し去りたい
- SDKがあるならさらに楽ができるかも

## 用意するもの
- Python
- LookerSDK

## 準備
### Looker Api SDK
公式説明
https://docs.looker.com/reference/api-and-integration/api-sdk

GitHub
https://github.com/looker-open-source/sdk-codegen/tree/master/python

とりあえずインストール

```
pip install looker_sdk
```

### 認証
- APIの認証key取得はこちら[リンク](https://www.niandc.co.jp/sol/tech/date20191213_1826.php)
- 環境変数の種類はこちら[リンク](https://github.com/looker-open-source/sdk-codegen)

```
### 環境変数設定
os.environ['LOOKERSDK_API_VERSION']='3.1'
os.environ['LOOKERSDK_BASE_URL']='https://xxxxxxxx.looker.com:19999'
os.environ['LOOKERSDK_CLIENT_ID']='xxxxxxxxxxxxxxxxxxxx'
os.environ['LOOKERSDK_CLIENT_SECRET']='xxxxxxxxxxxxxxxxxxxxxxxx'

### 認証
sdk = looker_sdk.init31() 
my_user = sdk.me()
print('####################')
print(my_user["first_name"])
print('####################')
```
iniファイルを読み込むやり方もあるらしいけども

![スクリーンショット 2020-12-22 19.50.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397770/1d3ae8c4-306d-d771-6f62-5f7c6f8244b1.png)

できた！SDKが認証情報を環境変数から読みとっってくれる模様。

## ローカルからLooker経由でSQLを流して結果を取得するぞ！

どこから調べればいいか。。。

とりあえずリファレンスを眺めてみる。。。。と


![スクリーンショット 2020-12-22 20.05.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397770/1206099d-d372-54b3-ec22-2c839d40b543.png)
[リンク](https://docs.looker.com/reference/api-and-integration/api-reference/v3.1/query#create_sql_runner_query)




おおおおおおっっっ！？APIのリファレンスでSQL Runnerっていうものがありますね。それっぽい！

![スクリーンショット 2020-12-22 20.13.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397770/34405880-f363-f0f5-42c3-541f61b24007.png)


どうやらBETA版みたいですね。(2020/12/23時点)
変わったら変わったでとりあえずGoGo!!


### さてどうやっていくか
恐らく使えるモジュールはこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397770/0a05cc1b-c3e2-9b82-bda8-df0e8c4788f9.png)
[リンク](https://github.com/looker-open-source/sdk-codegen/blob/master/python/looker_sdk/__init__.py)

- サンプルコードないので、ちょっと苦しい。
- リファレンスを見てみるとどうやら該当する部分の操作は以下のものであるようだ
    - クエリを登録
    - クエリの取得
    - クエリの実行
- おそらくキューに入れて実行する仕組みのようだ。キューは下記で確認できる
    - https://xxxx.looker.com/admin/queries
      
- ネットで探してみる限りsdkからAPIのURLに該当するメソッドを持ってくるらしい。
    - これはリファレンスの中に入っている。
    - ただ引数はどうすればいいか
        - SqlQueryCreateで作成するっぽい
            - SqlQueryCreate
                - model_name
                    - よくわからない。ただ、modelの文字列を入れたら動くようになった
                - sql
                    - 説明割愛

### クエリの登録
```
from looker_sdk import methods31, models31

# APIの引数を作成
SQL = "select * from xxxxxxx limit 10"

query = models31.SqlQueryCreate( model_name="xxxxxxxx",sql="select * from public.xxxxx limit 10")
# クエリを実行
result = sdk.create_sql_query(body=query).slug

``` 
どうやら、looker_sdkの中にAPIのバージョンに対応したモジュールがあるらしい。
今回は3.1なのでそれに該当するものを選択


### クエリの実行
``` 
sdk.run_sql_query(result,"csv",True)
``` 
- run_sql_query
    - 第一引数(必須)
        - クエリを登録した時に取得できるクエリの文字列
        - 実行するクエリを指定
    - 第二引数(必須)
        - 出力のファイル形式を指定
        - CSV以外にも,jsonやtxtなどでも出力できるらしい
    - 第三引数(任意)
        - ダウンロード有無を指定
        - デフォルトはfalseでダウンロード無し
    - 戻り値
        - ダウンロードしたときはバイナリで帰ってくる 


- SQLを投げて空のものが帰ってきたときはここをチェックしてください。
  - https://xxxx.looker.com/admin/queries
  - キューに入れて実行のような仕組みっぽいのでログが見えます。
  - API上からだとSQLがコケたと言おうことがわからなそうということ

バイナリで帰ってくるのでバイナリで保存してあげると使えるようになります

```
fw = open('result.csv', 'wb')
fw.write(sdk.run_sql_query(result,"csv",True))
fw.close()
```

## おわりに
正直、LookerをローカルからSQLを実行して嬉しい人っていうのは割とすくないかもとおもってしまっているところはありました。
多くの人はダッシュボード見るし、欲しけりゃBigQueryをpandasでつなげばいいじゃん勢も出てきそうなので、今回調べたもののメリットの大部分はSDKの使い方の様な気がしてなりません。Lookerの資産を使いつつ、Looker上で扱うにはあまりにも複雑だったり頻繁に変わるようなクエリについてはこのようにSDKを経由してSQLで取得→分析を自動的に回す仕組みを構築することに意義があるものだと思います。

## 参考文献
認証key取得
- https://dev.classmethod.jp/articles/looker-api-get-data/

公式説明
- https://docs.looker.com/reference/api-and-integration/api-sdk

looker-open-source(github)
- https://github.com/looker-open-source/sdk-codegen
- https://github.com/looker-open-source/sdk-codegen/tree/master/python