Looker API (v4.0) 入門 SQL Runner編

2023/12/13に公開

SQL RunnerのAPIを使ってみた

はじめに

対象読者

  • Lookerに知見がある人
  • Web技術、とくにhttpリクエストに知見がある人

前提

  • LookerのライセンスもしくはLookerを実行できる環境を持っていること

検証環境

  • Developerロールが付与されているLookerのライセンス

本題に入る前に情報を整理

Looker API is 何

Lookerを操作するためのAPIです。
APIの実行にはLookerのライセンスとCLIENT_IDとアクセスキーが必要です。
2023年12月においてはV3とV4バージョンがありますが、V4が推奨されています。

Looker APIを理解するための基礎知識

Looker APIを理解するためには以下の知識が必要です。

  • APIとは何か
  • httpリクエストに関すること
  • Lookerに関する基本用語

なお、特定のプログラミング言語を習得されている場合はLooker APIを活用したLooker API SDKがあります。

Looker APIを使ってみる

実際にLooker APIを使ってみます。

認証

まずは認証を行います。

login

エンドポイント:https://InstanceName/api/4.0/login
メソッド:POST
リクエスト用のJSON

{
  "method": "post",
  "content-type": "Application/json",
  "payload": {
    "client_id": "<client_id>",
    "client_secret": "<client_secret>"
  }
}

ここで取得したアクセストークン(<auth_token>)を使ってAPIを実行します。

Google Apps Scriptで認証

以下のコードはGoogle Apps ScriptでLookerを認証する例です。


// Lookerのインスタンス名
const BASE_URL = "https://InstanceName/api/4.0";
// LookerのクライアントID
let CLIENT_ID = PropertiesService.getScriptProperties().getProperty("LOOKER_CLIENT_ID");
// Lookerのアクセスキー
let CLIENT_SECRET = PropertiesService.getScriptProperties().getProperty("LOOKER_CLIENT_SECRET");

function login() {
 try{
  let post = {
    'method': 'post'
  };
  let response = UrlFetchApp.fetch(BASE_URL + "/login?client_id=" + CLIENT_ID + "&client_secret=" + CLIENT_SECRET, post);
  return JSON.parse(response.getContentText()).access_token;
 } catch(err) {
  return "Could not login to Looker. " + err
 }
}

Pythonで認証

以下のコードはPythonでLookerを認証する例です。

import requests
import json

# Lookerのインスタンス名
instance_name = "InstanceName"
# LookerのクライアントID
client_id = "client_id"
# Lookerのアクセスキー
client_secret = "client_secret"

# Lookerのログイン用のエンドポイント
login_endpoint = f"https://{instance_name}/api/4.0/login"
# LookerのSQL Runner用のエンドポイント
sql_runner_endpoint = f"https://{instance_name}/api/4.0/sql_queries"

# Lookerのログイン用のJSON
login_json = {
    "method": "post",
    "content-type": "Application/json",
    "payload": {
        "client_id": client_id,
        "client_secret": client_secret
    }
}

# Lookerのログイン用のリクエスト
login_response = requests.post(login_endpoint, json=login_json)
# Lookerのログイン用のレスポンス
login_response_json = json.loads(login_response.text)
# Lookerのアクセストークン
auth_token = login_response_json["access_token"]

SQL Runnerを動かす

create_sql_query

エンドポイント:https://InstanceName/api/4.0/sql_queries
メソッド:POST
リクエスト用のJSON

{
      "method": "post",
      "content-type" : "Application/json",
      "headers": {
        "Authorization": "token <auth_token>"
      },
      "payload": {
        "model_name":"<model_name>",
        "sql":"<SQL>"
      }
    }

Google Apps ScriptでSQL Runnerによるクエリを作成する

以下のコードはGoogle Apps ScriptでSQL Runnerによるクエリを作成する例です。


// Lookerのインスタンス名
const BASE_URL = "https://InstanceName/api/4.0";
// LookerのクライアントID
let CLIENT_ID = PropertiesService.getScriptProperties().getProperty("LOOKER_CLIENT_ID");
// Lookerのアクセスキー
let CLIENT_SECRET = PropertiesService.getScriptProperties().getProperty("LOOKER_CLIENT_SECRET");

function login() {
 try{
  let post = {
    'method': 'post'
  };
  let response = UrlFetchApp.fetch(BASE_URL + "/login?client_id=" + CLIENT_ID + "&client_secret=" + CLIENT_SECRET, post);
  return JSON.parse(response.getContentText()).access_token;
 } catch(err) {
  return "Could not login to Looker. " + err
 }
}

function LOOKER_CREATE_SQLRUNNER_QUERY(SQL){
  try {
    let payload = {
      "model_name":'model_name',
      "sql":SQL
    }
    let options = {
      "method": "post",
      "content-type" : "Application/json",
      "headers": {
        "Authorization": "token " + login()
      },
      "payload": JSON.stringify(payload)
    };

    // get request for the look
    let response = UrlFetchApp.fetch(BASE_URL + "/sql_queries", options);

    let resContent = JSON.parse(response.getContentText());
    return resContent["slug"];

  } catch (err) {
    console.log("ERROR");
    return "Uh oh! Something went wrong. Check your API credentials and if you're passing the correct parameters and that your Look exists!";
  }
}

function main(){
  let SQL = "SELECT id,name FROM table";
  let slug = LOOKER_CREATE_SQLRUNNER_QUERY(SQL);
  console.log(slug);
}

sql_query

エンドポイント:https://InstanceName/api/4.0/sql_queries/{slug}

メソッド:POST
リクエスト用のJSON

{
      "method": "post",
      "content-type" : "Application/json",
      "headers": {
        "Authorization": "token <auth_token>"
      }
    }

{slug}はcreate_sql_queryで作成したSQLのslugを指定します。

run_sql_query

エンドポイント:https://InstanceName/api/4.0/sql_queries/{slug}/run/{result_format}

メソッド:POST
リクエスト用のJSON

{
      "method": "post",
      "content-type" : "Application/json",
      "headers": {
        "Authorization": "token <auth_token>"
      }
    }

{slug}はcreate_sql_queryで作成したSQLのslugを指定します。
{result_format}は結果のフォーマットを指定します。

対応しているフォーマットは以下の通りです。

Google Apps ScriptでSQL Runnerで作成したクエリを実行する

以下のコードはGoogle Apps ScriptでSQL Runnerで作成したクエリを実行する例です。


// Lookerのインスタンス名
const BASE_URL = "https://InstanceName/api/4.0";
// LookerのクライアントID
let CLIENT_ID = PropertiesService.getScriptProperties().getProperty("LOOKER_CLIENT_ID");
// Lookerのアクセスキー
let CLIENT_SECRET = PropertiesService.getScriptProperties().getProperty("LOOKER_CLIENT_SECRET");

function login() {
 try{
  let post = {
    'method': 'post'
  };
  let response = UrlFetchApp.fetch(BASE_URL + "/login?client_id=" + CLIENT_ID + "&client_secret=" + CLIENT_SECRET, post);
  return JSON.parse(response.getContentText()).access_token;
 } catch(err) {
  return "Could not login to Looker. " + err
 }
}

function LOOKER_CREATE_SQLRUNNER_QUERY(SQL){
  try {
    let payload = {
      "model_name":'model_name',
      "sql":SQL
    }
    let options = {
      "method": "post",
      "content-type" : "Application/json",
      "headers": {
        "Authorization": "token " + login()
      },
      "payload": JSON.stringify(payload)
    };

    // get request for the look
    let response = UrlFetchApp.fetch(BASE_URL + "/sql_queries", options);

    let resContent = JSON.parse(response.getContentText());
    return resContent["slug"];

  } catch (err) {
    console.log("ERROR");
    return "Uh oh! Something went wrong. Check your API credentials and if you're passing the correct parameters and that your Look exists!";
  }
}

function LOOKER_RUN_QUERY(slug){
  try {
    let options = {
      "method": "post",
      "content-type" : "Application/json",
      "headers": {
        "Authorization": "token " + login()
      }
    };

    let limit = 500;
    // get request for the look
    let response = UrlFetchApp.fetch(BASE_URL + "/sql_queries/" + slug + "/run/csv", options);
    return Utilities.parseCsv(response.getContentText());

  } catch (err) {
    console.log("ERROR");
    return "Uh oh! Something went wrong. Check your API credentials and if you're passing the correct parameters and that your Look exists!";
  }
}

function main(){
  let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = spreadsheet.getSheetByName("data");

  let SQL = "SELECT * FROM table";
  let slug = LOOKER_CREATE_SQLRUNNER_QUERY(SQL);
  let res = LOOKER_RUN_QUERY(slug)

  for(let cnt=0;cnt < res.length;cnt++){
    sheet.appendRow(res[cnt]);
  }

}

まとめ

今回はLooker APIの中でもSQL RunnerのAPIを使ってみました。
SQL RunnerのAPIを使うことでLookerのデータを外部のシステムに取り込むことができます。
今回はSQL RunnerのAPIを使ってみましたが、Looker APIには他にも様々なAPIがあります。

次は別のAPIを使ってみたいと思います。

Discussion