Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

SQL 쿼리 결과 조회(Get Results SQL Query) (V2)

SQL 쿼리 결과를 원시 바이트로 받습니다. 형식은 실행 시 지정한 serializationFormat이며, 지정하지 않았다면 Apache Arrow입니다. CSV로 실행한 쿼리는 CSV를 반환합니다. 결과 조회 요청에서 형식을 다시 선택하는 매개변수는 없습니다.

위치이름자료형필수 여부의미
경로sqlQueryIdstring필수결과를 받을 쿼리 ID. 경로에 넣기 전에 퍼센트 인코딩 필요

쿼리 매개변수와 요청 본문은 없습니다. 쿼리를 실행한 사용자가 요청해야 합니다. 응답 본문은 필수 바이너리 데이터이며 QueryStatus JSON이 아닙니다.

이 엔드포인트는 long polling으로 최대 1분간 대기한 뒤 타임아웃됩니다. 쿼리가 아직 실행 중이라면 결과 조회를 안전하게 다시 요청할 수 있습니다. 취소, 실패 또는 권한 오류는 아래 오류 계약에 따라 처리합니다.

요청 예제는 결과를 문자열로 변환하지 않고 파일에 저장합니다. 파일 확장자는 실행 시 선택한 형식에 맞추고, Arrow를 JSON으로 파싱하거나 텍스트 모드로 저장하지 않습니다.

HTTP 요청

GET /api/v2/sqlQueries/{sqlQueryId}/getResults

작업 식별자는 v2.getResultsSqlQuery입니다. Authorization: Bearer <접근 토큰> 헤더로 인증합니다. OAuth 클라이언트에는 api:sql-queries-read 권한 범위가 필요합니다.

오류

실패 응답은 공통 오류 형식을 따릅니다.

오류 이름오류 코드HTTP 상태매개변수의미
QueryCanceledINVALID_ARGUMENT400없음쿼리가 취소되었습니다.
QueryFailedINTERNAL500errorMessage쿼리 실행이 실패했습니다.
QueryParseErrorINVALID_ARGUMENT400errorMessageSQL 문을 파싱할 수 없습니다.
QueryRunningINVALID_ARGUMENT400없음쿼리가 실행 중입니다.
ReadQueryInputsPermissionDeniedPERMISSION_DENIED403rids토큰에 쿼리 입력 리소스에 접근할 권한이 없습니다.
QueryPermissionDeniedPERMISSION_DENIED403없음토큰에 해당 쿼리에 접근할 권한이 없습니다.
GetResultsSqlQueryPermissionDeniedPERMISSION_DENIED403없음SQL 쿼리 결과를 조회할 권한이 없습니다.

요청 예제

FOUNDRY_HOST에는 https://를 제외한 Foundry 호스트를, FOUNDRY_TOKEN에는 유효한 토큰을 환경 변수로 제공합니다. SQL_QUERY_ID_URL_ENCODED에는 쿼리 응답의 queryId를 경로 조각으로 퍼센트 인코딩한 값을 제공합니다.

SQL_RESULT_FILE에는 결과를 저장할 파일 경로를 지정합니다. 파일에는 실행할 때 선택한 Arrow 또는 CSV 바이트를 기록하며 기존 파일이 있으면 덮어씁니다.

cURL

curl --fail --output "${SQL_RESULT_FILE}" \
	-H "Authorization: Bearer ${FOUNDRY_TOKEN}" \
	"https://${FOUNDRY_HOST}/api/v2/sqlQueries/${SQL_QUERY_ID_URL_ENCODED}/getResults"

Python

Requests 라이브러리가 설치된 Python 환경에서 사용합니다.

import os
import requests

HOSTNAME = os.environ["FOUNDRY_HOST"]
TOKEN = os.environ["FOUNDRY_TOKEN"]
headers = {
    "authorization": "Bearer {}".format(TOKEN)
}

with requests.get('https://{}/api/v2/sqlQueries/{}/getResults'.format(HOSTNAME, os.environ["SQL_QUERY_ID_URL_ENCODED"]), headers=headers, stream=True) as response:
    response.raise_for_status()
    with open(os.environ["SQL_RESULT_FILE"], "wb") as output:
        for chunk in response.iter_content(chunk_size=1024 * 1024):
            output.write(chunk)

Java

Apache HttpClient 4.5 API와 try-with-resources를 사용하는 예제입니다. 클래스 이름에 맞는 GetResultsSqlQueryExample.java 파일에서 사용합니다.

import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;

public class GetResultsSqlQueryExample {
    public static void main(String[] args) throws Exception {
        String HOSTNAME = System.getenv("FOUNDRY_HOST");
        String TOKEN = System.getenv("FOUNDRY_TOKEN");

        try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
            HttpGet request = new HttpGet("https://" + HOSTNAME + "/api/v2/sqlQueries/" + System.getenv("SQL_QUERY_ID_URL_ENCODED") + "/getResults");
            request.addHeader("authorization", String.format("Bearer %s", TOKEN));
            try (CloseableHttpResponse response = httpClient.execute(request)) {
                int status = response.getStatusLine().getStatusCode();
                if (status < 200 || status >= 300) {
                    throw new IOException("HTTP " + status);
                }
                try (OutputStream output = Files.newOutputStream(
                        Paths.get(System.getenv("SQL_RESULT_FILE")))) {
                    response.getEntity().writeTo(output);
                }
            }
        }
    }
}

JavaScript

fetch를 제공하는 Node.js의 ES 모듈(.mjs)에서 사용합니다. 서비스 사용자 토큰을 브라우저로 전달하지 않습니다.

import { createWriteStream } from "node:fs";
import { Readable } from "node:stream";
import { pipeline } from "node:stream/promises";

const HOSTNAME = process.env.FOUNDRY_HOST;
const TOKEN = process.env.FOUNDRY_TOKEN;

fetch(`https://${HOSTNAME}/api/v2/sqlQueries/${process.env.SQL_QUERY_ID_URL_ENCODED}/getResults`, {
    method: 'GET',
    headers: {
        'Authorization': `Bearer ${TOKEN}`,
    }
}).then(async (response) => {
    if (!response.ok) {
        throw new Error(`HTTP ${response.status}`);
    }
    await pipeline(
        Readable.fromWeb(response.body),
        createWriteStream(process.env.SQL_RESULT_FILE)
    );
});

PowerShell

$TOKEN = $env:FOUNDRY_TOKEN
$HOSTNAME = $env:FOUNDRY_HOST

$headers = @{
    "authorization" = "Bearer $TOKEN"
}

Invoke-WebRequest -Uri "https://$HOSTNAME/api/v2/sqlQueries/${env:SQL_QUERY_ID_URL_ENCODED}/getResults" `
	-Headers $headers `
    -OutFile $env:SQL_RESULT_FILE