> ## Documentation Index
> Fetch the complete documentation index at: https://villagesql.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# MySQL のテーブルを REST API として公開する方法

> VillageSQL の vsql_rest 拡張機能で MySQL のテーブルを HTTP 経由で提供する方法 — フィルター、列の選択、ページネーション、テーブルごとのメソッド、および最初に変更しなければならないデフォルト。

> [card] [VillageSQL is a drop-in replacement for MySQL with extensions.](https://villagesql.com/docs/en/8.4/stable/install-server.md)
>
> All examples on this page work on VillageSQL. Install Now →

> [!NOTE]
>
> このガイドはプレビュー機能を使用します。サーバーを
> `--vsql_allow_preview_extensions=ON` で起動してください。そうしないと `INSTALL EXTENSION` は拒否されます。

いくつかのテーブルの前に読み取り専用の JSON エンドポイントを置くには、通常、小さなサービスを書き、デプロイし、データベースアカウントを与え、稼働させ続ける必要があります。VillageSQL の `vsql_rest` 拡張機能は、代わりにサーバープロセスの内部からそれらのテーブルを提供するため、2 つ目のプロセスも新しいデプロイもありません。

デフォルトは開発者のマシン向けに作られており、ネットワーク向けではありません。何かに対してポートを開く前に、下の「ポートを公開する前に」を読んでください。

## 有効にする

```sql theme={null}
INSTALL EXTENSION vsql_rest;
```

先にデータベースとそのテーブルを作成します。リスナーは起動時にデータベースのレイアウトを読み取り、`vsql_rest.schema_ttl` 秒間（デフォルトは 60）キャッシュするため、その後に作成したテーブルはキャッシュが期限切れになるまで `table not found` と応答します。

```sql theme={null}
CREATE DATABASE shop;
USE shop;

CREATE TABLE products (
    id       INT PRIMARY KEY,
    name     VARCHAR(40),
    category VARCHAR(20),
    price    DECIMAL(8,2),
    in_stock INT
);

INSERT INTO products VALUES
    (1, 'Budget Widget',   'widget', 29.99, 120),
    (2, 'Standard Widget', 'widget', 79.99,  40),
    (3, 'Premium Widget',  'widget', 149.99,  4),
    (4, 'Cable, 2m',       'cable',   9.99, 500),
    (5, 'Cable, 5m',       'cable',  14.99,   0);
```

次に、データベースを指定し、提供してよいテーブルを指定して、リスナーを起動します。

```sql theme={null}
SET GLOBAL vsql_rest.schema = 'shop';
SET GLOBAL vsql_rest.allowed_tables = 'products';
SET GLOBAL vsql_rest.vsql_rest_enabled = ON;
```

## 読み取り

テーブルはパスであり、クエリ文字列がフィルタリングを行います。各フィルターは `column=operator.value` です。

```bash theme={null}
curl 'http://127.0.0.1:3000/products?category=eq.widget&order=price.desc&limit=2'
```

```json theme={null}
[{"id":3,"name":"Premium Widget","category":"widget","price":"149.99","in_stock":4},{"id":2,"name":"Standard Widget","category":"widget","price":"79.99","in_stock":40}]
```

必要な列だけを要求し、それ以外は要求しません。

```bash theme={null}
curl 'http://127.0.0.1:3000/products?select=name,price&in_stock=eq.0'
```

```json theme={null}
[{"name":"Cable, 5m","price":"14.99"}]
```

`or=(...)` で条件を組み合わせます。

```bash theme={null}
curl 'http://127.0.0.1:3000/products?or=(category.eq.cable,price.gt.100)&select=id,name'
```

```json theme={null}
[{"id":3,"name":"Premium Widget"},{"id":4,"name":"Cable, 2m"},{"id":5,"name":"Cable, 5m"}]
```

`limit` と `offset` でページをめくります。

```bash theme={null}
curl 'http://127.0.0.1:3000/products?order=id.asc&limit=2&offset=2'
```

```json theme={null}
[{"id":3,"name":"Premium Widget","category":"widget","price":"149.99","in_stock":4},{"id":4,"name":"Cable, 2m","category":"cable","price":"9.99","in_stock":500}]
```

演算子は `eq`、`neq`、`lt`、`lte`、`gt`、`gte`、`like`、`cs_like`、`in`、および `is` です。`in` は `?id=in.(1,3)` のようにリストを取り、`is` は `?price=is.null` または `?price=is.not.null` のように null を取ります。`limit` のないリクエストは最大 `vsql_rest.max_rows` 行を返し、初期値は 1000 です。

## 許可リスト

`allowed_tables` にないテーブルは、API から見れば存在しません。

```bash theme={null}
curl 'http://127.0.0.1:3000/orders'
```

```json theme={null}
{"message":"table not found: orders","details":null,"hint":null,"code":"VSQL0001"}
```

レスポンスは 404 で、テーブルが存在しない場合も、単に公開を控えている場合も、同じ内容です。

> [!WARNING]
>
> `allowed_tables` を空のままにしておくことは、テーブルなしを意味しません。**すべて**の
> テーブルを意味します。リスナーを有効にする前に、公開するつもりのテーブルを
> 設定してください。

## テーブルごとのメソッド制限

`table_methods` は各テーブルが受け付ける HTTP メソッドを指定します。形式は `table:METHOD,METHOD` で、テーブルの間は `|` で区切ります。

```sql theme={null}
SET GLOBAL vsql_rest.table_methods = 'products:GET';
```

デフォルトではすべてのテーブルがすべてのメソッドを受け付けるため、リスナーが起動する前にこれを設定してください。テーブルに許可されていないメソッドは拒否されます。

```json theme={null}
{"message":"method not allowed: POST","details":null,"hint":null,"code":"VSQL0001"}
```

書き込みの許可も同じ設定です。

```sql theme={null}
SET GLOBAL vsql_rest.table_methods = 'products:GET,POST';
```

```bash theme={null}
curl -X POST -H 'Content-Type: application/json' \
     -d '{"id":6,"name":"Cable, 10m","category":"cable","price":19.99,"in_stock":10}' \
     'http://127.0.0.1:3000/products'
```

成功した挿入は空のボディで 201 を返します。キーの重複は 409 として返ります。

```json theme={null}
{"message":"Duplicate entry '6' for key 'products.PRIMARY'","details":null,"hint":null,"code":"VSQL0001"}
```

## 動作を確認する

5 つのステータスカウンターがリスナーについて報告し、実際にバインドしたポートも含まれます。

```sql theme={null}
SHOW STATUS LIKE 'vsql_rest%';
```

```
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| vsql_rest.connections_total | 0     |
| vsql_rest.http_port         | 3000  |
| vsql_rest.https_port        | 0     |
| vsql_rest.requests_active   | 0     |
| vsql_rest.requests_total    | 16    |
+-----------------------------+-------+
```

何も待ち受けていないとき `http_port` は 0 を示します。これはリスナーが起動したかどうかを知る最も手早い方法です。`vsql_rest.port` を 0 に設定するとオペレーティングシステムにポートの選択を任せ、どのポートが選ばれたかはこのカウンターで読み取ります。

## ポートを公開する前に

デフォルトは扉を開けたままにしており、それぞれ単独では妥当です。

`require_auth` は `OFF` から始まるため、どのリクエストもトークンを持たず、必要ともしません。空の `allowed_tables` はスキーマ全体を公開します。空の `table_methods` は `DELETE` を含むすべてのメソッドを許可し、その状態のリスナーへの `DELETE` は成功します。

```bash theme={null}
curl -X DELETE 'http://127.0.0.1:3000/products?id=eq.6'
```

204 を返し、行は消えます。

まとめると、他に何も設定せずに有効にしたリスナーは、ポートに到達できる誰にでも、スキーマ内のすべてのテーブルの読み取り、挿入、更新、および削除を許します。ラップトップ上では便利です。それ以外の場所では、有効にする前に 4 つのことを変更してください。

```sql theme={null}
SET GLOBAL vsql_rest.allowed_tables = 'products';
SET GLOBAL vsql_rest.table_methods  = 'products:GET';
SET GLOBAL vsql_rest.require_auth   = ON;
SET GLOBAL vsql_rest.jwt_secret     = '...';
```

次に、`ssl_cert` と `ssl_key` を設定して HTTPS で提供します。バインドアドレスの設定はなく、リスナーは起動した瞬間からすべてのインターフェイスにバインドするため、ファイアウォールでポートを遮断し、リバースプロキシだけが到達できるようにしてください。

## トラブルシューティング

| 症状 | 対処 |
| - | - |
| インストール時に `ERROR 3219 ... requires preview capabilities` | サーバーを `--vsql_allow_preview_extensions=ON` で起動する |
| Connection refused | リスナーが停止している。`vsql_rest.vsql_rest_enabled` を確認し、次に `SHOW STATUS` で `vsql_rest.http_port` を読む |
| 存在するテーブルに対して `table not found` | `allowed_tables` に含まれていないか、`vsql_rest.schema` が別のデータベースを指している |
| 書き込みが 405 を返す | `table_methods` がそのテーブルにそのメソッドを許可していない |
| 拡張機能の再インストール後に設定が消えた | `UNINSTALL EXTENSION` は永続化された設定を削除する。再適用する |

## 関連項目

* [vsql\_rest](https://villagesql.com/docs/ja/extensions/vsql-rest.md) — 拡張機能のリファレンスページ。追加されるすべての設定を掲載
* [SQL から HTTP リクエストを送る](https://villagesql.com/docs/ja/guides/http-requests-in-mysql.md) — 同じサーバーが応答する側ではなく呼び出す側になる
* [外部 API のデータで行を拡充する](https://villagesql.com/docs/ja/guides/rest-api-enrichment.md) — クエリを他者の API と結合する
* [MySQL のセキュリティ強化](https://villagesql.com/docs/ja/guides/security-hardening.md) — ポートが到達可能になる前に他に閉じておくべきもの


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.