こんにちは!
前回はDifyのSupabaseプラグインを使用してDifyからデータベース操作をする方法について紹介しました。
Supabaseプラグインは手軽にノーコードでデータベースアクセスが可能ではありますが、データ取得時のフィルタ条件の指定が一致条件しか対応していないなど機能が限定的です。そこで今回はHTTPノードを使用してREST APIを直接叩く方法を紹介したいと思います。
ワークフローサンプル(INSERT)
REST APIを叩いてINSERTを行うものを作ってみます。
REST API用の環境設定を追加
REST APIのコールに必要な接続設定(エンドポイントとAPIキー)を環境変数に設定しておきます。ワークフロー内で設定を使い回ししやすいようにするためです。
「ENV」のアイコンから環境変数の設定を開きます。

「環境変数を追加」から、環境変数を追加します。
まずエンドポイントを設定します。
- タイプ: String
- 変数名: supabase_endpoint ※任意の変数名
- 値: エンドポイントのURL。https://[プロジェクトID].supabase.co の形式。SupabaseのData API項目内で確認出来ます。
- 説明: 任意
続いてAPIキーをシークレットに設定します。

- タイプ: Secret ※設定を見られないようにシークレットにします
- 変数名: supabase_api_key ※任意の変数名
- 値: Publishable keyのAPI KEY。SupabaseのAPI Keys項目内で確認出来ます。
- 説明: 任意
ワークフロー作成
前回と同様、まずユーザー入力ノードから作成します。

titleとmessageの入力をそれぞれStringの短文、段落、で用意。
次にユーザー入力のノードの「+」をクリックしてHTTPリクエストのノードを追加し、SupabaseのREST APIをコールするノードを作り込みます。

POSTでエンドポイントを指定し、リクエストヘッダーにAPIキーを指定します。リクエストボディはJSON形式で挿入したい行データを指定。
- メソッド: POST
- URL: [環境変数supabase_endpoint]/rest/v1/messages
- ヘッダー
apikey: [環境変数supabase_api_key]
Content-Type: application/json - ボディ
タイプ: JSON
本文: {"title": "[ユーザー入力/title]", "message": "[ユーザー入力/message]"}
これで、REST APIでINSERTするノードが出来ました。
最後に出力ノードを追加して完成です。

出力変数にはHTTPノードのbody出力を指定しておきます。
テスト実行
作成したワークフローを「テスト実行」から実行します。

titleとmessageに適当な文字列を入力し「実行開始」をクリック。
各ノードが順に実行されて正常に完了しました。

結果の出力は詳細情報に表示されています。INSERTではREST APIからはレスポンスボディに何も返されないので戻り値のbodyは空です。
SupabaseのTable Editorで確認してみます。

テーブルにレコードが追加されていることが確認できました。
行データのエスケープ
前回のプラグインの際にも注意点として取り上げましたが、行データのJSONに変数の値などを直接挿入するときは適切なエスケープ処置がされていることが望ましいです。そこで今回もテンプレートノードを追加して、JSONを事前に組み立てるようにします。
HTTPノードの前にテンプレートノードを追加します。

設定する内容は前回と同様です。
入力変数に、ユーザー入力のtitleとmessageをセットしたものを用意(arg1とarg2)。テンプレートのコードのところにJSON形式で行データを記述します。JSONの内に記述する入力変数arg1とarg2は、適切なエスケープがされるようにtojsonフィルタを指定しておきます。
HTTPノードのボディにはテンプレートノードのoutput出力を指定し直します。

これで安全に行データを扱えるようになりました。
ワークフローサンプル(SELECT)
今度はREST APIでSELECTを行うワークフローを作成してみます。
先ほどと同様にユーザー入力ノードから作成します。

入力項目としてtitleをStringで用意します。
続いて「+」を押し、HTTPリクエストのノードを追加します。

GETでエンドポイントを指定し、リクエストヘッダーにAPIキーを指定します。リクエストパラメーターで抽出条件を指定します。
- メソッド: GET
- URL: [環境変数supabase_endpoint]/rest/v1/messages
- リクエストヘッダー
apikey: [環境変数supabase_api_key] - リクエストパラメーター
title: like.*[ユーザー入力/title]*
今回リクエストパラメーターには、PostgRESTのLIKE検索の指定を記述しています。
このようにすると、SQLクエリでの「カラム名 LIKE "%値%"」と同等の記述になります。※詳細はPostgRESTのドキュメントを参照
これで、REST APIでSELECTするノードが出来ました。前回プラグインの時にできなかったLIKE条件指定での抽出を指定しています。
テスト実行
作成したワークフローを「テスト実行」から実行します。
titleに「テスト2」と入力し「実行開始」をクリックします。

titleに「テスト2」が含まれるレコード2件がJSON形式のテキストでレスポンスbodyに返されていることが確認できました。
レスポンスbodyに返されるのはobjectではなくテキストであることに注意しましょう。返されたJSONをobjectとして使うにはパースする必要があります(これが面倒なところ)。
まとめ
HTTPノードを使用することで、SupabaseのREST APIを直接コールしてデータベースへのアクセスをすることが出来ました。Supabaseプラグインより設定項目が多くなりますが、自由度は上がるのでこちらのほうが利用価値がありそうに思います。
次回は、汎用のデータベースクライアントのプラグインでデータベースにアクセスする方法にも触れたいと思います。SQLクエリを発行できるので一番自由度が高い方法になります。

