メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
MySQL にはネットワークリクエストを送る組み込みの手段がありません。HTTP API を呼び出したい場合は、データベースからデータを取り出し、アプリケーションコードでリクエストを送り、結果を書き戻します。VillageSQL の vsql_http 拡張機能は、http_get()、http_post()、およびすべての HTTP メソッドを SQL に直接追加するため、データがある場所から外部 API を呼び出せます。

問題: API 呼び出しのたびにデータベースを離れる

VillageSQL を使わない典型的なパターンです。
これは動作しますが、各行が 3 回の往復になります。SELECT、API 呼び出し、UPDATE です。データ拡充のロジックは、データがあるスキーマではなく、アプリケーションコードに置かれます。

VillageSQL の場合: SQL からの HTTP

http_get(url) は GET リクエストを送り、レスポンス全体を含む JSON 文字列を返します。
vsql_http のすべての関数は同じ形の JSON を返します。

文字セットの変換

VillageSQL 0.0.6 以前では、VEF の STRING 関数はバイナリ文字セットを返します。結果を JSON_VALUE や JSON_EXTRACT に渡す前に、CONVERT(... USING utf8mb4) で包んでください。
VillageSQL 0.0.7 以降は正しい文字セットを直接返すため、そこでは CONVERT はもう必要ありません。しかし残しておいても害はなく、以下のすべての例は 0.0.6 以前との互換性のために引き続き CONVERT を使っています。キャストの繰り返しを避けるには、CONVERT を付けて一度変数に代入し、その変数を再利用してください。

POST リクエスト

http_post(url, content_type, body) は本文付きの POST を送ります。

カスタムヘッダーとその他のメソッド

http_request(method, url, headers_json, body, content_type, options_json) は、カスタムヘッダー付きの任意のメソッドを扱います。
headers_json 引数は、キーがヘッダー名で値がヘッダー値の JSON オブジェクトです。

利用できるすべての関数

すべての関数は NULL の入力に対して NULL を返します。接続の失敗(接続拒否、DNS の失敗、 タイムアウト)の場合も、HTTP 関数は NULL を返し、curl のエラーメッセージを含む 警告を出します。リクエストが消えたように見えるときは、SHOW WARNINGS で 確認してください。

URL エンコード

url_encode() と url_decode() は、クエリパラメータのパーセントエンコードを扱います。

既知の制限

256KB のレスポンス上限 — 256KB を超えるレスポンスは切り詰められます。これは SQL クエリで使われる典型的な API ペイロードを十分に扱えますが、大きなファイルのダウンロードには適していません。この上限で切られたレスポンスは有効な JSON ではなくなります。JSON_EXTRACT/JSON_UNQUOTE はそれに対して ERROR 3141 を発生させますが、JSON_VALUE はデフォルトの NULL ON ERROR 動作のもとで、エラーではなく Warning 3141 とともに NULL を返します。 JSON_VALUE のサイズ制限 — 抽出した値が MySQL の内部サイズ制限を超えると、JSON_VALUE は NULL を返します。大きなレスポンス本文には、代わりに JSON_UNQUOTE(JSON_EXTRACT(...)) を使ってください。
同期的 — すべての HTTP 呼び出しは、完了するかタイムアウトするまでブロックします。max_execution_time は、ブロックしている vsql_http の呼び出しを制限も中断もしません。遅い、または到達できないエンドポイントは、それ自身の接続/読み取りタイムアウトの間、ステートメントを保持し続けます。http_get/http_post/http_put/http_delete/http_patch はオプションを受け取りません。http_request(method, url, headers_json, body, content_type, options_json) だけが、options_json 引数の中で秒単位の {"timeout": N} としてタイムアウトを受け取ります(デフォルトは 30)。短くする必要があるときは、省略形の関数の代わりに http_request を使ってください(HTTP Webhookを参照)。

トラブルシューティング

次のステップ

関連項目