📌

TiDB Serverless の Data Service を Postman から操作する :その2 POST/INSERT

2024/10/15に公開

https://zenn.dev/kameping/articles/a761f2daaf9af3
前回の記事ではTiDB Serverless の Data Serviceの機能を用いてPostmanからGET/Select クエリを実行しました。
今日はPOST/INSERTを行います。

さっそくやってみる

1. 検証用デーブル作成

TiDB Cloudのマネージメントコンソールで以下のSQLを実行します。

use test;
CREATE TABLE postman (
    column1 varchar(255),
    column2 varchar(255)
);

2. Data Service でEndPoint を作成

Data Serviceから+をクリックしてCreate Endpointを選択します。

以下のSQLをペーストしてRunボタンをクリックします。

USE test;
INSERT INTO postman (column1,column2)
VALUES ("test", "kameman");

PropertiesタブでメソッドをPOSTに変更します。

Path/datainsertと名前を付けます。

画面右上Testボタンをクリックしてステータスコード200が戻っていることを確認します。

Deployボタンをクリックします。

Show Code ExampleをクリックしBasic Authenticationを選択し表示されるcurlコマンドをコピーして一度テストしておきます。${PUBLIC_KEY}${PRIVATE_KEY}は前回の記事と同様にAPI KEYの値に置き換えます。
(curl環境が無い方はこの手順を飛ばしても問題ありません)

3. Postmanへのインポート

APIが出来ましたのでAppを選択し後画面右上のRun in Postmanをクリックします。

Run in Postman for Webをクリックした後、Copy Data App URLをクリックします。

Postman側の画面でインポートをクリックします。

コピーしたいURLをペーストすると前回の環境を上書きするか聞いてきますので、置き換えるを選びます。以下のように新しくPOSTが作成されています。環境変数としてセットされていた${PUBLIC_KEY}${PRIVATE_KEY}がきえるはずなので再度入力し保存をクリックします。

POSTのAPIコールを実行して200が戻ってくれば成功です。

4. 外部パラメータによる書き込む値の取得

Data Service は外部からSQLを実行できる機能ではなく、あらかじめ設定済のSQLがAPIとして提供される、と前回の記事で整理しました。一方でこのSQLの中に変数を設定しておくことでリクエストボディからその値を流し込むことが可能です。


まずTiDB側でSQLを以下のように変更します。

USE test;
INSERT INTO postman (column1,column2)
VALUES (${column1},${column2});

そうすると画面右のパラメータタブが変数を2つ認識します。${column1}${column2}です。
Test ValuesAuto-Fill dummy test dataをクリックします。

(余談ですがオーバーレイで2つのアイコンが重なって見づらいので消す方法をご存じの方を教えてください)
Testで200が戻ってきたらDeployをクリックし、先ほどと同じ手順で再度Postmanに上書きインポートを行います。Postman側で変数が上書きされて消えるので再度投入します。保存をクリックしてPOSTのAPIコールを見るとボディタブに2つの変数がセットされていることがわかります。

テーブルの中身が以下となっており変数名がそのまま文字列として扱われています。

これはTiDB Serverless Data Service と Postmanの変数の記載方法の違いによるものです。
Postman側で設定されているボディを以下に変更します。

{
  "column1": "${column1}",
  "column2": "${column2}"
}
{
  "column1": "{{column1}}",
  "column2": "{{column2}}"
}

次に変数を2つ以下のように追加します。

保存を押して再度POSTのAPIコールを実行すると値が入力されます。

curlの場合は普通にJSONボディで値を引き渡せば同様の結果となります。

Discussion