コンテンツにスキップ
HTTPの書き込み

HTTPの書き込み

書き込みAPIのエンドポイントは/db/write/{TABLE}です。{TABLE}は、データを保存するテーブル名です。

query APIでもINSERT文を実行できますが、リクエストごとにqパラメーター用のSQL文字列を構成する必要があり、非効率です。 データの取り込みには、通常はINSERTと同じように動作するwrite APIを使用します。 write APIでは、1回のリクエストで複数のレコードを一括挿入できます。

パラメーター

書き込みパラメーター

パラメーター既定値説明
timeformatns時刻の単位:smsusns
tzUTCタイムゾーン:UTCLocal、地域指定
methodinsert書き込み方式:insertappend
dbMACHBASEDB複数データベース環境で対象データベース名を指定します。 Since v8.7.0

INSERT vs. APPEND

既定では、/db/write APIはINSERT INTO ...文でデータを保存します。少量のレコードの取り込みでは、append方式との性能差はほとんどありません。

数十万件以上の大量データを取り込む場合は、method=appendを指定します。これにより、暗黙の既定値method=insertではなく、Machbase Neoのappend方式を使用します。

複数データベース

サーバーが複数の名前付きデータベースをホストする場合、dbクエリパラメーターで対象を指定できます。method=insertmethod=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 ]
        ]
    }
}
EOF

Content-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...)文と同じ構造です。

名前説明
dataobjectデータボディ全体
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エポックではなく文字列形式の場合は、timeformattzを指定します。

```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}

timeformattzパラメーターを指定します。

```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形式の場合だけに適用します。

パラメーター既定値説明
headerskip:先頭行をスキップします。
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.0002

Content-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.0002

Content-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

timeformattzクエリパラメーターを指定します。

```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
```
最終更新日