# データの読み書き

PostgREST と同じ構文です。既存のクライアント SDK がそのまま使えます。

```
GET    /rest/v1/<テーブル>?select=id,body&order=created_at.desc&limit=20
GET    /rest/v1/<テーブル>?body=ilike.*ソウル*
POST   /rest/v1/<テーブル>          本文: {"body":"こんにちは"}  または  [{...},{...}]
PATCH  /rest/v1/<テーブル>?id=eq.<値>
DELETE /rest/v1/<テーブル>?id=eq.<値>
```

## 演算子

`eq` `neq` `gt` `gte` `lt` `lte` `like` `ilike` `match` `imatch` `cs` `cd` `ov` `sl` `sr` `nxr` `nxl` `adj` `isdistinct` `is` `in` `fts` `plfts` `phfts` `wfts`

前に `not.` を付けると否定になります（`status=not.eq.done`）。`or=(a.eq.1,b.gt.2)`、`and=(…)` で
条件をまとめられ、`like` と `ilike` の `*` は `%` と同じです。`select` では別名（`label:title`）、
型変換（`id::text`）、外部キーでつながったテーブル（`*,author(name)`）が使えます。
関数は `POST /rest/v1/rpc/<関数>` で呼び出します。埋め込んだテーブルへの条件と多対多の関係はまだありません。
足りないものが必要なら、`run_sql` でビューを作り、そのビューを読んでください。

**未知の演算子は、その名前を挙げて拒否します。** 黙って無視することはありません。
適用されなかったフィルターは、アクセスルールのもとでは情報漏えいになるからです。

## 韓国語の部分一致検索

`pg_trgm` が有効になっています。韓国語は単語に助詞が付くため単語単位の検索がうまく効かないので、
3文字単位の比較を使います。

```sql
create index if not exists notes_body_trgm on notes using gin (body extensions.gin_trgm_ops);
select * from notes where body % 'ソウル';
```

埋め込み検索（pgvector）や地図（PostGIS）など、ほかの拡張機能は `blackwall://extensions` をご覧ください。

## CSV でのエクスポートとインポート

`export_table_csv` がテーブルの行を CSV で返します（1MB まで。超えると行の区切りで切って `truncated`）。`filters` と `sort` で範囲と順序を選び、大きなテーブルは範囲を分けて何回かに分けて受け取ります。
`import_table_csv` は CSV をテーブルに入れます（2MB、10,000行まで）。1行目の列名と同じ列に入り、1行でも入れられなければ何も入れず、行番号と理由を返します。
REST では `GET /v1/projects/<ref>/tables/<テーブル>/csv` と `POST /v1/projects/<ref>/tables/<テーブル>/csv {csv, columns}` です。

---

https://end.blackall.ai/docs/data-api?lang=ja
