SQL over HTTP 레퍼런스
Turso 데이터베이스는 HTTP로 접근할 수 있어요. 이 API를 이용하면 SQL over HTTP 방식으로 SQL 작업을 수행하고, 서버 버전 정보를 확인하고, 상태(health)를 모니터링할 수 있어요.
출처: 문서
본문
참고: 가능하면 네이티브 SDK 사용을 추천해요.
Base URL
데이터베이스 URL의 프로토콜만 바꾸면 돼요. Turso 데이터베이스는 turso://, libSQL 데이터베이스는 libsql://를 https://로 바꿔 주세요.
https://[databaseName]-[organizationSlug].turso.io
데이터베이스 Base URL은 Turso CLI로 확인할 수 있어요.
Turso CLI로 HTTP URL 얻기
turso db show <database-name> --http-url
인증 (Authentication)
Turso는 Bearer 인증 방식을 사용해요. 보호된 요청에는 모두 Authorization 헤더에 API 토큰을 담아야 해요.
Authorization: Bearer ***
Turso CLI로 토큰 만들기
turso db tokens create <database-name>
엔드포인트 (Endpoints)
데이터베이스에서는 아래 엔드포인트를 사용할 수 있어요.
POST /v2/pipeline
/v2/pipeline 엔드포인트로 데이터베이스를 조회할 수 있어요. 이 엔드포인트는 데이터베이스 커넥션에 대해 수행할 작업 목록을 받아요. 지원되는 작업 타입은 다음과 같아요.
execute: 커넥션에서 문(statement)을 실행해요.close: 커넥션을 닫아요.
단순 쿼리 (Simple query)
{
"requests": [
{ "type": "execute", "stmt": { "sql": "CREATE TABLE users (name)" } },
{ "type": "close" }
]
}
{
"baton": null,
"base_url": null,
"results": [
{
"type": "ok",
"response": {
"type": "execute",
"result": {
"cols": [],
"rows": [],
"affected_row_count": 0,
"last_insert_rowid": null,
"replication_index": "1"
}
}
},
{
"type": "ok",
"response": {
"type": "close"
}
}
]
}
참고: 요청에서 명시적으로 닫지 않으면(위 예시처럼) 커넥션은 타임아웃이 될 때까지 열려 있어요. 커넥션에서 보내는 모든 요청은 타임아웃을 연장해요. 더 이상 필요 없는 커넥션은 직접 닫아 주는 게 좋아요.
파라미터 바인딩 (Parameter binding)
파라미터가 바인딩된 쿼리는 두 가지 방식이 있어요.
- 위치 기반(positional) 쿼리 파라미터. 파라미터 목록에서의 위치로 바인딩되고
?접두사를 써요. 쿼리가 위치 기반 파라미터를 사용한다면 값은args필드에 배열로 넣어요.
{
"requests": [
{
"type": "execute",
"stmt": {
"sql": "SELECT * FROM users WHERE name = ?",
"args": [
{
"type": "text",
"value": "Turso"
}
]
}
},
{
"type": "close"
}
]
}
{
"baton": null,
"base_url": null,
"results": [
{
"type": "ok",
"response": {
"type": "execute",
"result": {
"cols": [
{
"name": "name",
"decltype": "TEXT"
}
],
"rows": [
[
{
"type": "text",
"value": "Turso"
}
]
],
"affected_row_count": 0,
"last_insert_rowid": null
}
}
},
{
"type": "ok",
"response": {
"type": "close"
}
}
]
}
- 이름 기반(named) 바인드 파라미터. 파라미터를 이름으로 참조하고
:,@,$접두사를 써요. 쿼리가 이름 기반 파라미터를 사용한다면named_args필드에 파라미터와 값을 매핑한 객체 배열을 넣어요.
{
"requests": [
{
"type": "execute",
"stmt": {
"sql": "SELECT * FROM users WHERE name = :name OR name = $second_name OR name = @third_name",
"named_args": [
{
"name": "name",
"value": {
"type": "text",
"value": "Turso"
}
},
{
"name": "second_name",
"value": {
"type": "text",
"value": "Not Turso"
}
},
{
"name": "third_name",
"value": {
"type": "text",
"value": "Maybe Turso"
}
}
]
}
},
{
"type": "close"
}
]
}
{
"baton": null,
"base_url": null,
"results": [
{
"type": "ok",
"response": {
"type": "execute",
"result": {
"cols": [
{
"name": "name",
"decltype": "TEXT"
}
],
"rows": [
[
{
"type": "text",
"value": "Turso"
}
]
],
"affected_row_count": 0,
"last_insert_rowid": null
}
}
},
{
"type": "ok",
"response": {
"type": "close"
}
}
]
}
참고: 각
named_args의name속성은 접두사를 붙여도 되고 생략해도 돼요. 위 예시에서는 생략했지만 두 방식 모두 유효해요.각 인자의
type필드는 컬럼 데이터 타입에 해당하고,null,integer,float,text,blob중 하나예요.
참고:
blob타입을 사용한다면value속성을base64로 바꾸고, 요청을 보내기 전에 인자를 base64로 인코딩해 주세요.
노트: JSON에서
value는 정밀도 손실을 피하려고String으로 표현해요. 일부 JSON 구현은 모든 숫자를 64비트 부동소수점으로 다루거든요.
인터랙티브 쿼리 (Interactive query)
같은 커넥션에서 여러 작업을 여러 번의 왕복(roundtrip)에 걸쳐 수행하고 싶을 때가 있어요. 이럴 때는 커넥션을 바로 닫지 않으면 돼요.
{
"requests": [{ "type": "execute", "stmt": { "sql": "BEGIN" } }]
}
{
"baton": "m7lVVgEvknpf1P1irxHsHqrAqH7BLiwO4DQIAwr93PdZWGvdBNugLSokSsCZNkry",
"base_url": null,
"results": [
{
"type": "ok",
"response": {
"type": "execute",
"result": {
"cols": [],
"rows": [],
"affected_row_count": 0,
"last_insert_rowid": null,
"replication_index": "1"
}
}
}
]
}
baton을 돌려받은 걸 볼 수 있어요. 커넥션을 닫지 않았기 때문이에요. 이 baton을 사용하면 같은 커넥션에서 추가 쿼리를 이어서 할 수 있어요.
{
"baton": "m7lVVgEvknpf1P1irxHsHqrAqH7BLiwO4DQIAwr93PdZWGvdBNugLSokSsCZNkry",
"requests": [
{ "type": "execute", "stmt": { "sql": "CREATE TABLE users (name)" } },
{
"type": "execute",
"stmt": { "sql": "INSERT INTO users VALUES (\"iku\")" }
},
{ "type": "execute", "stmt": { "sql": "COMMIT" } },
{ "type": "close" }
]
}
참고: 트랜잭션과 커넥션 모두 타임아웃이 있어요. 트랜잭션은 완료까지 5초의 시간이 주어지고, 커넥션은 10초간 유휴 상태면 닫혀요.
응답 타입 (Response types)
응답에는 다음 필드들이 담겨요.
| Field | Type | Description |
|---|---|---|
baton |
string | 커넥션을 서버에서 식별해 재사용할 수 있게 해주는 값이에요. |
base_url |
string | 요청을 처리한 서버의 Base URL이에요. 이후 요청에서 이 URL을 재사용하면 해당 서버로 라우팅을 강제할 수 있어요. |
results |
array | 파이프라인에서 수행한 각 요청의 결과예요. |
results 배열에는 파이프라인의 각 요청 결과가 담겨요. 각 결과는 다음 필드를 가져요.
| Field | Type | Description |
|---|---|---|
cols |
array | 반환된 행들의 컬럼 목록이에요. |
rows |
array | 쿼리가 반환한 행들이에요. |
affected_row_count |
integer | 쿼리가 영향을 준 행 수예요. |
last_insert_rowid |
integer | 마지막으로 삽입된 행의 ID예요. |
replication_index |
string | 이 쿼리가 실행된 복제(replication) 시점이에요. |
rows_read |
integer | 쿼리가 읽은 행 수예요. |
rows_written |
integer | 쿼리가 쓴 행 수예요. |
query_duration_ms |
float | 쿼리 소요 시간(밀리초)이에요. |
GET /version
데이터베이스를 실행 중인 서버의 현재 버전을 확인하려면 /version 엔드포인트를 사용해요.
curl -L -X GET 'https://[databaseName]-[organizationSlug].turso.io/version' \
-H 'Authorization: Bearer ***'
sqld 0.21.9 (67f3ea5d 2023-10-26)
GET /health
데이터베이스 상태를 확인하려면 /health 엔드포인트를 사용해요. 본문 없이 HTTP 상태 코드만 돌려줘요.
curl -L -X GET 'https://[databaseName]-[organizationSlug].turso.io/health' \
-H 'Authorization: Bearer ***'
This response has no body data.
GET /dump
/dump 엔드포인트로 데이터베이스를 덤프할 수 있어요.
curl -L -X GET 'https://[databaseName]-[organizationSlug].turso.io/dump' \
-H 'Authorization: Bearer ***'
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS mytable (
content TEXT,
embedding FLOAT32(1536)
);
CREATE TABLE IF NOT EXISTS libsql_vector_index (type TEXT, name TEXT, vector_type TEXT, block_size INTEGER, dims INTEGER, distance_ops TEXT);
INSERT INTO libsql_vector_index VALUES('diskann','mytable_idx','float32',128,1536,'cosine');
CREATE INDEX mytable_idx USING diskann_cosine_ops ON mytable (embedding);
COMMIT;
멀티 DB 스키마나 벡터 데이터베이스를 사용 중이라면 내부 관리 테이블을 표현하는 문들도 함께 보여요.
스키마 마이그레이션 상태 (Schema Migration Status)
Turso는 관리형 멀티 테넌트 스키마 시스템인 Multi-DB Schemas를 제공해요. 이 기능을 쓰면 하나의 데이터베이스가 스키마를 관련 자식 데이터베이스들과 자동으로 공유하고, 부모 데이터베이스의 변경 사항이 관련 데이터베이스들에 자동으로 전파돼요.
/v1/jobs 엔드포인트로 스키마 마이그레이션 상태를 모니터링할 수 있어요.
경고: 현재 AWS에서는 Free, Developer, Scaler 플랜에서 사용할 수 없어요.
GET /v1/jobs
스키마의 모든 마이그레이션 작업 요약을 반환해요.
curl -X GET 'https://[databaseName]-[organizationSlug].turso.io/v1/jobs' \
-H 'Authorization: Bearer ***'
{
"schema_version": 4,
"migrations": [
{
"job_id": 43,
"status": "RunSuccess"
},
{
"job_id": 42,
"status": "RunSuccess"
},
{
"job_id": 39,
"status": "RunSuccess"
}
]
}
응답 필드 (Response Fields)
schema_version(number): 현재 스키마 버전.migrations(array): 마이그레이션 작업 목록- Migration Object:
job_id(number): 마이그레이션 작업의 고유 ID.status(string): 작업의 현재 상태. 가능한 값:WaitingDryRun,DryRunSuccess,DryRunFailure,WaitingRun,RunSuccess,RunFailure
- Migration Object:
GET /v1/jobs/:id
특정 마이그레이션 작업의 상세 정보를 반환해요.
curl -X GET 'https://[databaseName]-[organizationSlug].turso.io/v1/jobs/:id' \
-H 'Authorization: Bearer ***'
{
"job_id": 1,
"status": "RunSuccess",
"error": null,
"progress": [
{
"namespace": "db1",
"status": "Success",
"error": null
},
{
"namespace": "db2",
"status": "Failure",
"error": "Connection lost"
}
]
}
경로 파라미터 (Path Parameters)
id(number, required): 마이그레이션 작업의 ID.
응답 필드 (Response Fields)
job_id(number): 마이그레이션 작업의 고유 ID.status(string): 작업의 전체 상태. 가능한 값은/v1/jobs엔드포인트와 같아요.error(string): 작업이 실패한 경우 오류 메시지, 아니면 null.progress(array): 개별 데이터베이스의 마이그레이션 상태 목록- Progress Object:
namespace(string): 데이터베이스 이름.status(string): 이 데이터베이스의 마이그레이션 상태. 가능한 값:Enqueued,DryRunSuccess,DryRunFailure,Run,Success,Failureerror(string): 이 데이터베이스의 마이그레이션이 실패한 경우 오류 메시지, 아니면 null.
- Progress Object:
변경 사항 듣기 (Listen to changes)
/beta/listen 엔드포인트로 데이터베이스에 커밋된 변경 사항을 구독할 수 있어요.
이 기능은 기술 프리뷰(technical preview) 상태예요.
경고: 현재 AWS에서는 Free, Developer, Scaler 플랜에서 사용할 수 없어요.
참고: 데이터베이스 그룹이
v0.24.18이상 버전을 사용해야 해요 —turso group update <group-name> --version latest
GET /beta/listen
curl -L 'https://[primary-instance-id]-[databaseName]-[organizationSlug].turso.io/beta/listen?table=TABLE_NAME' \
-H 'Authorization: Bearer ***'
쿼리 파라미터 (Query Parameters)
table(string, required): 구독할 테이블 이름.action(string, required): 구독할 액션 이름 —insert,update, 또는delete.
더 알아보기 (Learn more)
- SQL over HTTP 퀵스타트 — SDK 선택부터 첫 요청까지 빠르게 시작하기
- 멀티 DB 스키마 — 스키마 공유와 마이그레이션 개념 이해하기
- Turso CLI — 데이터베이스와 토큰 관리 명령어 모음
- Platform API — 리소스를 API로 관리하는 방법