跳转到主要内容

HTTP Handler

Databend HTTP Handler 是一个 REST API ,用于向服务器发送需要执行的查询语句,并接收返回给客户端的结果。

HTTP Handler 由 databend-query 提供,通过 --http_handler_host--http_handler_port (默认值为 8000) 指定主机和端口。

HTTP 方法

概览

该 HTTP Handler 通过具有长轮询的页面中返回结果。

  1. 使用 QueryRequest 类型的 JSON 将查询 POST 到 /v1/query,其中包含要执行的 SQL,返回结果是 QueryResponse 类型的 JSON。
  2. QueryResponse 中的字段作进一步处理:
    1. 通过 GET next_uri 返回查询结果的下一页 (也是 QueryResponse 类型的 JSON )。 以相同的方式处继续处理,直到 next_uri 为 null。
    2. (可选)通过 GET kill_uri 终止查询。 返回空正文。
    3. (可选)对 stats_uri 进行 GET 获取一次统计信息(无需长轮询),返回带有空 data 字段的 QueryResponse。

简单示例

curl -u root: --request POST '127.0.0.1:8001/v1/query/' --header 'Content-Type: application/json' --data-raw '{"sql": "SELECT avg(number) FROM numbers(100000000)"}'

SQL 将使用默认会话和分页设置运行:

  1. 使用新的一次性会话对 default 数据库进行查询。
  2. 每个请求在返回之前最多等待1秒钟。

更多高级配置,请参考本页其他内容。

返回的 JSON(格式化)类似这样:

{
"id": "3cd25ab7-c3a4-42ce-9e02-e1b354d91f06",
"session_id": "8d3a737d-2f6c-4df7-ba44-6dfc818255ce",
"session": {},
"schema": {
"fields": [
{
"name": "avg(number)",
"default_expr": null,
"data_type": {
"type": "Float64Type"
}
}
],
"metadata": {}
},
"data": [
[
"49999999.5"
]
],
"state": "Succeeded",
"error": null,
"stats": {
"scan_progress": {
"rows": 100000000,
"bytes": 800000000
},
"write_progress": {
"rows": 0,
"bytes": 0
},
"result_progress": {
"rows": 0,
"bytes": 0
},
"running_time_ms": 466.85395800000003
},
"stats_uri": "/v1/query/3cd25ab7-c3a4-42ce-9e02-e1b354d91f06",
"next_uri": null
"affect": null
}

查询请求

QueryRequest

字段类型必填默认描述
sqlstring要执行的 SQL 语句
session_idstring仅在重新使用服务器端会话时使用
sessionSessionState
paginationPagination此 POST 请求全局唯一的 query_id

SessionState

字段type必填默认描述
databasestring"default"设置当前数据库
keep_server_session_secsint0最后一个查询完成后保留会话的时长(单位:秒)
settingsmap(string, string)0

OldSession

字段类型必填默认描述
idstringQueryResponse.session_id 中的 session_id

Pagination:每个 HTTP 请求返回的关键条件(在所有剩余结果准备好返回之前)

字段类型必填默认描述
wait_time_secsu321长轮询时间

查询响应

QueryResponse:

字段类型描述
statestring可选值:Running、Failed、Succeeded
errorQueryErrorSQL 解析或执行错误
idstring此 POST 请求全局唯一的 query_id
dataarray数组中的每个元素代表返回结果中的一行
schemaSchema返回结果的 Schema
affectAffect某些查询影响
session_idString
sessionSessionState

Schema:

字段类型描述
fieldsarray字段排序顺序
metadataobject包含额外 Meta 数据的键值对映射

Field:

字段类型
namestring
data_typestring
nullablebool

Stats:

字段类型描述
running_time_msfloat内部执行查询所耗时间(单位:毫秒)
scan_progressQueryProgress查询扫描进度

Progress:

字段类型
read_rowsint
read_bytesint

Error:

字段类型描述
statsintDatabend 内部的错误代码
messagestring错误消息
backtracestring

Affect:

字段类型描述
typestringChangeSetting/UseDB
...其他字段根据类型不同而变化

响应状态代码

不同类型的错误状态代码:

代码错误
200SQL 无效或查询失败,详细信息在 JSON 的 error 字段中
404找不到 query_id 或 page
400请求格式非法

当状态码不是200时,出错原因可在响应体的字符串中找到。

数据格式

.data 中的所有字段值都以字符串表示,客户端需要借助 schema 字段中的信息来解释这些值。

会话支持 (可选)

客户端可以在 session 字段中配置会话。

{
"sql": "select 1",
"session": {
"db": "db2",
"settings": {
"max_threads": "1"
}
}
}

所有设置的值都应该是字符串。

默认情况下,每个请求在服务器内有自己的会话。在 SQL 执行完成后, 甚至在客户端获取结果数据之前,会话应该立即摧毁。 执行 setuse 这种更改上下文的 SQL 语句需要会话支持。有两个选择:

服务器端会话

对于启动会话的第一个 QueryRequest:将 QueryRequest.session.keep_server_session_secs 设置为一个正整数,例如10。 记住返回的 QueryResponse.session_id。

{
"sql": "...;",
"session": {
"keep_server_session_secs": 100
}
}

对于以下使用会话的 QueryRequest:使用 QueryResponse.session_id 作为 QueryRequest.session.id。

{
"sql": "...;",
"session_id": "<QueryResponse.session_id>"
}

客户端会话

Handler 将在 affect 字段中返回有关更改设置或当前数据库的信息,客户端可以记住这些更改并将它们放在后面请求的会话字段中。

客户端会话响应将包含 session 字段,该字段包括请求中的 session 字段和以及应用到它的 affect。 session 字段只用在 next_url 中,且必须是在 state 字段值为 Succeeded 的情况下。

set 语句:

{
"sql": "set max_threads=1;",
"session": {
"database": "db1",
"settings": {
"max_threads": "6"
}
}
}
{
"affect": {
"type": "ChangeSetting",
"key": "max_threads",
"value": "1",
"is_global": false
},
"session": {
"database": "db1",
"settings": {
"max_threads": "1"
}
}
}

use 语句:

{"sql": "use db2",
"session": {
"database": "db1",
"settings": {
"max_threads": "6"
}
}
}
{
"affect": {
"type": "UseDB",
"name": "db2"
},
"session": {
"database": "db2",
"settings": {
"max_threads": "1"
}
}
}