Looker API (v4.0) 入門 SQL Runner編
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}は結果のフォーマットを指定します。
対応しているフォーマットは以下の通りです。
-
json
-
csv
-
txt
-
md
-
sql
-
レスポンスデータ
- String
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