本文介紹時序引擎提供的基于HTTP協議的通用SQL接口的定義和用法。
使用須知
對于非Java語言的應用開發,可以使用本文的API接口直接向時序引擎發送SQL語句。
對于Java語言的應用開發,建議基于Java JDBC Driver構建時序引擎的應用程序,具體請參見Java JDBC Driver開發手冊。
說明單機版不支持此功能。
請求路徑與方法
請求路徑 | 請求方法 | 描述 |
/api/v2/sql | POST | 發送并執行SQL語句。 |
請求內容
請求上述API時,直接將SQL語句寫入HTTP請求的請求體,并且建議在請求頭設置Content-Type
為text/plain
。以Python代碼為例,在Python代碼中向/api/v2/sql
傳送一條SQL語句的示例如下:
import requests
url = "http://ld-bp1s0vbu8955w****-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242/api/v2/sql"
payload = """CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
)"""
r = requests.post(url, payload)
if r.status_code == 200:
print(r.content)
else:
print(r.content)
payload = """insert into sensor (device_id, region, time, temperature, humidity) values
('F07A1260','north-cn','2021-04-22 15:33:00',12.1,45),
('F07A1260','north-cn','2021-04-22 15:33:10',13.2,47),
('F07A1260','north-cn','2021-04-22 15:33:20',10.6,46),
('F07A1261','south-cn','2021-04-22 15:33:00',18.1,44),
('F07A1261','south-cn','2021-04-22 15:33:10',19.7,44)"""
r = requests.post(url, payload)
if r.status_code == 200:
print(r.content)
else:
print(r.content)
payload = "select * from sensor"
r = requests.post(url, payload)
if r.status_code == 200:
print(r.content)
else:
print(r.content)
時序引擎基于SQL-92標準支持使用半角分號(;)作為SQL語句的終止符,但是在調用/api/v2/sql
接口傳遞SQL語句時,不能在結尾使用半角分號(;)否則請求過程中會報錯。
支持的查詢參數
/api/v2/sql支持的URL查詢參數如下所示:
名稱 | 描述 |
database | SQL執行時的默認Database。 當指定的SQL中寫入或查詢的時序表名未顯式指定所屬數據庫名時,時序引擎默認會在該參數指定的database中搜尋操作對象的表名。未指定該查詢參數時,引擎會默認在名為 |
chunked | 是否流式返回結果數據。默認為false。 當指定為true時,查詢結果數據會以多個JSON塊的方式返回,每個JSON塊最多包含chunk_size行數據。在解析結果數據時,只需要逐個解析JSON塊即可。每個JSON塊的結構參考響應內容部分描述。 |
chunk_size | 指定流式返回結果時每次返回的最大行數。chunked=true時生效,默認為1000。 |
用戶認證信息指定
當Lindorm時序引擎開啟用戶鑒權時,通過/api/v2/sql
發送SQL請求時需要向HTTP請求頭中填入用戶認證信息。目前/api/v2/sql
遵循的是BASIC AUTH
認證方式,編碼后的認證信息需要指定在HTTP請求頭的Authorization
字段中。
基本認證憑據的格式如下:
BASIC {BASE64編碼的認證信息}
其中BASE64編碼的認證信息為${用戶名}:${對應的用戶密碼}
,以半角冒號(:)分隔。
各編程語言編碼并填充BASIC AUTH認證信息的方法,請查詢所用語言的相關類庫的使用文檔,不在此羅列。
對于初始用戶名root和初始密碼root,BASE64編碼后HTTP請求頭的Authorization
字段應包含的信息如下所示:
Authorization: Basic cm9vdDpyb290
響應內容
查詢成功的HTTP響應碼為200,響應內容為JSON格式數據。說明如下:
名稱 | 類型 | 描述 |
columns | Array | 字符串數組 表示返回結果集中列名。 |
metadata | Array | 字符串數組 表示返回結果集中每一列的數據類型名稱。可能返回的數據類型請參見數據類型。 |
rows | Array | 數組的數組 表示返回結果集的行的集合。其中的每一個數組代表著一行數據,每行數據中的具體數據與columns中返回的列一一對應。 |
SQL執行出錯時的響應消息中的HTTP響應碼為400,響應消息體是一個JSON格式數據,其包含的字段說明如下:
名稱 | 類型 | 描述 |
code | int | 錯誤碼。 |
sqlstate | String | SQL狀態碼。 |
message | String | 錯誤詳情。 |
關于錯誤碼對應的具體錯誤,具體請參見常見錯誤碼參考。
示例
以下示例通過常用的curl命令,展示了如果通過該HTTP接口對Lindorm時序引擎執行SQL。
創建名為DB1的Database。
curl -X POST http://ld-xxxxxxxxx-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242/api/v2/sql -d 'CREATE DATABASE DB1'
在DB1下創建名為SENSOR的時序數據表。
curl -X POST http://ld-xxxxxxxxx-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242/api/v2/sql?database=DB1 -d 'CREATE TABLE SENSOR (device_id VARCHAR TAG,region VARCHAR TAG,time TIMESTAMP,temperature DOUBLE,humidity DOUBLE)'
或者
curl -X POST http://ld-xxxxxxxxx-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242/api/v2/sql -d 'CREATE TABLE DB1.SENSOR (device_id VARCHAR TAG,region VARCHAR TAG,time TIMESTAMP,temperature DOUBLE,humidity DOUBLE)'
當用戶鑒權開關開啟時,以一個名為
tsdbuser
的用戶查詢上述SENSOR時序表。curl -X POST -u tsdbuser:password http://ld-xxxxxxxxx-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242/api/v2/sql?database=DB1 -d 'SELECT device_id, region, time, MAX(temperature) as max_t FROM SENSOR WHERE time >= 1619076780000 AND time <= 1619076800000 SAMPLE BY 20s'
說明示例中已事先對用戶tsdbuser賦予了時序表SENSOR的相關權限。