HTTPの書き込み
書き込みAPIのエンドポイントは/db/write/{TABLE}です。{TABLE}は、データを保存するテーブル名です。
query APIでもINSERT文を実行できますが、リクエストごとにqパラメーター用のSQL文字列を構成する必要があり、非効率です。
データの取り込みには、通常はINSERTと同じように動作するwrite APIを使用します。
write APIでは、1回のリクエストで複数のレコードを一括挿入できます。
パラメーター
書き込みパラメーター
| パラメーター | 既定値 | 説明 |
|---|---|---|
| timeformat | ns | 時刻の単位:s、ms、us、ns |
| tz | UTC | タイムゾーン:UTC、Local、地域指定 |
| method | insert | 書き込み方式:insert、append |
| db | MACHBASEDB | 複数データベース環境で対象データベース名を指定します。 Since v8.7.0 |
INSERT vs. APPEND
既定では、/db/write APIはINSERT INTO ...文でデータを保存します。少量のレコードの取り込みでは、append方式との性能差はほとんどありません。
数十万件以上の大量データを取り込む場合は、method=appendを指定します。これにより、暗黙の既定値method=insertではなく、Machbase Neoのappend方式を使用します。
複数データベース
サーバーが複数の名前付きデータベースをホストする場合、dbクエリパラメーターで対象を指定できます。method=insertとmethod=appendの両方に適用します。JSONボディのリクエストでは、クエリパラメーターの代わり、または併用して、最上位の"db"フィールドでも指定できます。両方を指定すると、クエリパラメーターが優先されます。
dbが省略または空の場合、既定のデータベースMACHBASEDBが対象です。データベース名の形式が不正なら400 Bad Requestを返します。データベースが存在しない場合や、接続ユーザーにアクセス権がない場合もエラーを返します。
POST http://127.0.0.1:5654/db/write/EXAMPLE?db=OTHERDB
Content-Type: application/json
{
"data": {
"columns":["name", "time", "value"],
"rows": [
[ "json-data", 1670380342000000000, 1.0001 ]
]
}
}curl -X POST 'http://127.0.0.1:5654/db/write/EXAMPLE?db=OTHERDB' \
-H "Content-Type: application/json" \
--data-binary @- << 'EOF'
{
"data": {
"columns":["name", "time", "value"],
"rows": [
[ "json-data", 1670380342000000000, 1.0001 ]
]
}
}
EOFContent-Typeヘッダー
machbase-neoサーバーは、Content-Typeヘッダーで入力データストリームの形式を判別します。
JSONにはContent-Type: application/json、CSVにはContent-Type: text/csv、行単位のJSONにはContent-Type: application/x-ndjsonを指定します。
Content-Encodingヘッダー
クライアントがgzip圧縮したストリームを送信する場合は、Content-Encoding: gzipヘッダーを設定し、入力データのエンコーディングをmachbase-neoに通知します。
入力
JSON
このリクエストメッセージは、INSERT INTO {table} (columns...) VALUES (values...)文と同じ構造です。
| 名前 | 型 | 説明 |
|---|---|---|
| data | object | データボディ全体 |
| data.columns | 文字列の配列 | 列の一覧を指定します。 |
| data.rows | タプルの配列 | レコード値の配列です。 |
JSON
{
"data": {
"columns":["name", "time", "value"],
"rows": [
[ "json-data", 1670380342000000000, 1.0001 ],
[ "json-data", 1670380343000000000, 2.0002 ]
]
}
}Content-Typeヘッダーをapplication/jsonに設定します。
```http
POST http://127.0.0.1:5654/db/write/EXAMPLE
Content-Type: application/json
{
"data": {
"columns":["name", "time", "value"],
"rows": [
[ "json-data", 1670380342000000000, 1.0001 ],
[ "json-data", 1670380343000000000, 2.0002 ]
]
}
}
```圧縮JSON
入力ストリームがgzip圧縮されている場合は、Content-Encoding: gzipヘッダーでmachbase-neoに通知します。
```http
POST http://127.0.0.1:5654/db/write/EXAMPLE
Content-Type: application/json
Content-Encoding: gzip
< /csv/post-data.json.gz
```timeformatを使用するJSON
時刻フィールドがUNIXエポックではなく文字列形式の場合は、timeformatとtzを指定します。
```http
POST http://127.0.0.1:5654/db/write/EXAMPLE
?timeformat=DEFAULT
&tz=Asia/Seoul
Content-Type: application/json
{
"data": {
"columns":["name", "time", "value"],
"rows": [
[ "json-data", "2022-12-07 02:32:22", 1.0001 ],
[ "json-data", "2022-12-07 02:32:23", 2.0002 ]
]
}
}
```NDJSON
NDJSON(Newline Delimited JSON)は、各行が有効なJSONオブジェクトとなるストリーミング形式です。大規模なデータやストリーミングデータの処理に適しています。
このリクエストメッセージも、INSERT INTO {table} (columns...) VALUES (values...)文と同じ構造です。
NDJSON
{"NAME":"ndjson-data", "TIME":1670380342000000000, "VALUE":1.001}
{"NAME":"ndjson-data", "TIME":1670380343000000000, "VALUE":2.002}Content-Typeヘッダーをapplication/x-ndjsonに設定します。
```http
POST http://127.0.0.1:5654/db/write/EXAMPLE
Content-Type: application/x-ndjson
{"NAME":"ndjson-data", "TIME":1670380342000000000, "VALUE":1.001}
{"NAME":"ndjson-data", "TIME":1670380343000000000, "VALUE":2.002}
```timeformatを使用するNDJSON
時刻フィールドがUNIXエポックではなく文字列形式の場合は、以下のように指定します。
{"NAME":"ndjson-data", "TIME":"2022-12-07 02:33:22", "VALUE":1.001}
{"NAME":"ndjson-data", "TIME":"2022-12-07 02:33:23", "VALUE":2.002}timeformatとtzパラメーターを指定します。
```http
POST http://127.0.0.1:5654/db/write/EXAMPLE
?timeformat=DEFAULT
&tz=Local
Content-Type: application/x-ndjson
{"NAME":"ndjson-data", "TIME":"2022-12-07 02:33:22", "VALUE":1.001}
{"NAME":"ndjson-data", "TIME":"2022-12-07 02:33:23", "VALUE":2.002}
```CSV
以下のオプションは、ボディがCSV形式の場合だけに適用します。
| パラメーター | 既定値 | 説明 |
|---|---|---|
| header | skip:先頭行をスキップします。columns:ヘッダー行の項目がテーブルの列名に対応します。 | |
| delimiter | , | フィールド区切り文字 |
CSVデータにヘッダー行がある場合は、header=skipクエリパラメーターで先頭行を無視します。
ヘッダー行で使用する列を指定するには、header=columnsを使用します。ヘッダーはテーブルの列名と一致する必要があり、内部でINSERT INTO TABLE(columns...) VALUES(...)の列一覧として使用します。
ヘッダー行がなく、headerオプションを省略する場合、各行のフィールドはテーブルの全列の順序と一致する必要があります。INSERT INTO TABLE VALUES(...)文に対応するためです。
append方式の特性上、
method=appendではheader=columnsオプションは動作しません。
header=skip
header=skipを指定すると、サーバーは先頭行を無視します。データはテーブルの列順に並べてください。
NAME,TIME,VALUE
csv-data,1670380342000000000,1.0001
csv-data,1670380343000000000,2.0002Content-Typeヘッダーは、text/csvを指定します。
```http
POST http://127.0.0.1:5654/db/write/EXAMPLE?header=skip
Content-Type: text/csv
NAME,TIME,VALUE
csv-data,1670380342000000000,1.0001
csv-data,1670380343000000000,2.0002
```header=columns
CSVのフィールド順がテーブルの列順と異なる場合や、一部の列だけを含む場合は、header=columnsを指定します。サーバーは先頭行を列名として扱います。以下の例では、内部でINSERT INTO EXAMPLE (TIME, NAME, VALUE) VALUES(?, ?, ?)と同じ文を生成します。
TIME,NAME,VALUE
1670380342000000000,csv-data,1.0001
1670380343000000000,csv-data,2.0002Content-Typeヘッダーは、text/csvを指定します。
```http
POST http://127.0.0.1:5654/db/write/EXAMPLE?header=columns
Content-Type: text/csv
TIME,NAME,VALUE
1670380342000000000,csv-data,1.0001
1670380343000000000,csv-data,2.0002
```圧縮CSV
入力ストリームがgzip圧縮されている場合は、Content-Encoding: gzipヘッダーでmachbase-neoに通知します。
```http
POST http://127.0.0.1:5654/db/write/EXAMPLE?header=skip
Content-Type: text/csv
Content-Encoding: gzip
< /csv/post-data.json.gz
```timeformatを使用するCSV
timeformatとtzクエリパラメーターを指定します。
```http
POST http://127.0.0.1:5654/db/write/EXAMPLE
?header=skip
&timeformat=Default
&tz=Asia/Seoul
Content-Type: text/csv
NAME,TIME,VALUE
csv-data,2022-12-07 11:39:32,1.0001
csv-data,2022-12-07 11:39:33,2.0002
```例
APIの詳細は、リクエストのエンドポイントとパラメーターを参照してください。
テストテーブル
```http
GET http://127.0.0.1:5654/db/query
?q=create tag table if not exists EXAMPLE (name varchar(40) primary key, time datetime basetime, value double)
```Time
この例のサンプルファイルの時刻は、秒単位のUNIXエポック時刻です。読み込む際は、timeformat=sを指定してください。他の時刻精度のデータでは、その精度に合わせて変更します。Machbase Neoは、既定で時刻をナノ秒(ns)として扱います。
エポック時刻を使用するJSON
```http
POST http://127.0.0.1:5654/db/write/EXAMPLE
?timeformat=s
Content-Type: application/json
{
"data": {
"columns":["NAME","TIME","VALUE"],
"rows": [
["wave.sin",1676432361,0],
["wave.sin",1676432362,0.406736],
["wave.sin",1676432363,0.743144],
["wave.sin",1676432364,0.951056],
["wave.sin",1676432365,0.994522]
]
}
}
```行の検索
```http
GET http://127.0.0.1:5654/db/query
?q=select * from EXAMPLE limit 10
```エポック時刻を使用するCSV
以下のようにCSVにヘッダー行がある場合は、header=skipを指定します。
```http
POST http://127.0.0.1:5654/db/write/EXAMPLE
?timeformat=s
&header=skip
Content-Type: text/csv
NAME,TIME,VALUE
wave.sin,1676432361,0.000000
wave.cos,1676432361,1.000000
wave.sin,1676432362,0.406736
wave.cos,1676432362,0.913546
wave.sin,1676432363,0.743144
```ヘッダーなしのCSV
```http
POST http://127.0.0.1:5654/db/write/EXAMPLE?timeformat=s
Content-Type: text/csv
wave.sin,1676432361,0.000000
wave.cos,1676432361,1.000000
wave.sin,1676432362,0.406736
wave.cos,1676432362,0.913546
wave.sin,1676432363,0.743144
```CSV
Insert
```http
POST http://127.0.0.1:5654/db/write/EXAMPLE
?timeformat=Default
Content-Type: text/csv
wave.sin,2023-02-15 03:39:21,0.111111
wave.sin,2023-02-15 03:39:22.111,0.222222
wave.sin,2023-02-15 03:39:23.222,0.333333
wave.sin,2023-02-15 03:39:24.333,0.444444
wave.sin,2023-02-15 03:39:25.444,0.555555
``````http
GET http://127.0.0.1:5654/db/query
?q=select * from EXAMPLE limit 10
&timeformat=Default
&format=csv
```Append
大容量のCSVファイルでは、append方式でinsert方式より数倍高速に取り込めます。
```http
POST http://127.0.0.1:5654/db/write/EXAMPLE?timeformat=s&method=append
Content-Type: text/csv
wave.sin,1676432361,0.000000
wave.cos,1676432361,1.000000
wave.sin,1676432362,0.406736
wave.cos,1676432362,0.913546
wave.sin,1676432363,0.743144
```タイムゾーンを指定したCSV
```http
POST http://127.0.0.1:5654/db/write/EXAMPLE
?timeformat=Default
&tz=Asia/Seoul
Content-Type: text/csv
wave.sin,2023-02-15 12:39:21,0.111111
wave.sin,2023-02-15 12:39:22.111,0.222222
wave.sin,2023-02-15 12:39:23.222,0.333333
wave.sin,2023-02-15 12:39:24.333,0.444444
wave.sin,2023-02-15 12:39:25.444,0.555555
```UTCでの検索
```http
GET http://127.0.0.1:5654/db/query
?q=select * from EXAMPLE limit 10
&timeformat=Default
&format=csv
```RFC3339
```http
POST http://127.0.0.1:5654/db/write/EXAMPLE
?timeformat=RFC3339
Content-Type: text/csv
wave.sin,2023-02-15T03:39:21Z,0.111111
wave.sin,2023-02-15T03:39:22Z,0.222222
wave.sin,2023-02-15T03:39:23Z,0.333333
wave.sin,2023-02-15T03:39:24Z,0.444444
wave.sin,2023-02-15T03:39:25Z,0.555555
```UTCでの検索
```http
GET http://127.0.0.1:5654/db/query
?q=select * from EXAMPLE limit 10
&format=csv
&timeformat=RFC3339
```タイムゾーン付きのRFC3339Nano
```http
POST http://127.0.0.1:5654/db/write/EXAMPLE
?timeformat=RFC3339Nano
&tz=America/New_York
Content-Type: text/csv
wave.sin,2023-02-14T22:39:21.000000000-05:00,0.111111
wave.sin,2023-02-14T22:39:22.111111111-05:00,0.222222
wave.sin,2023-02-14T22:39:23.222222222-05:00,0.333333
wave.sin,2023-02-14T22:39:24.333333333-05:00,0.444444
wave.sin,2023-02-14T22:39:25.444444444-05:00,0.555555
```America/New_Yorkタイムゾーンでの検索
```http
GET http://127.0.0.1:5654/db/query
?q=select * from EXAMPLE limit 10
&format=box
&timeformat=RFC3339Nano
&tz=America/New_York
```Timeformat
```http
POST http://127.0.0.1:5654/db/write/EXAMPLE
?timeformat=Default
Content-Type: text/csv
wave.sin,2023-02-15 03:39:21,0.111111
wave.sin,2023-02-15 03:39:22.111111111,0.222222
wave.sin,2023-02-15 03:39:23.222222222,0.333333
wave.sin,2023-02-15 03:39:24.333333333,0.444444
wave.sin,2023-02-15 03:39:25.444444444,0.555555
```UTCでの検索
```http
GET http://127.0.0.1:5654/db/query
?q=select * from EXAMPLE limit 10
&format=csv
&timeformat=Default
```カスタムTimeformat
- ニューヨークのタイムゾーンで
hour:min:sec-SPLIT-year-month-day形式を使用
```http
POST http://127.0.0.1:5654/db/write/EXAMPLE
?timeformat=03:04:05.999999999-SPLIT-2006-01-02
&tz=America/New_York
Content-Type: text/csv
wave.sin,10:39:21-SPLIT-2023-02-14 ,0.111111
wave.sin,10:39:22.111111111-SPLIT-2023-02-14 ,0.222222
wave.sin,10:39:23.222222222-SPLIT-2023-02-14 ,0.333333
wave.sin,10:39:24.333333333-SPLIT-2023-02-14 ,0.444444
wave.sin,10:39:25.444444444-SPLIT-2023-02-14 ,0.555555
```行の検索
```http
GET http://127.0.0.1:5654/db/query
?q=select * from EXAMPLE limit 5
&format=csv
&timeformat=2006-01-02 03:04:05.999999999
&tz=America/New_York
```