Data Explorer クエリでのパラメータの使用

パラメーターは、Discourse の Data Explorer クエリで使用できる強力なツールです。パラメーターを使用すると、クエリをより動的かつカスタマイズ可能にすることができ、クエリに値をハードコーディングする代わりに、クエリ実行時に入力を求める変数を宣言できます。

パラメーターの宣言

パラメーターを宣言するには、次の構文を使用できます。

-- [params]
-- int :parameter_name = 10

クエリのパラメーターセクションは、常に -- [params] で始まり、各パラメータータイプは新しい行に記述されます。ここで、parameter_name はパラメーターの名前で置き換えられます。

これにより、クエリを実行するたびに異なる値を入力できるフィールドが作成されます。

パラメーターのタイプ

Data Explorer クエリでパラメーターを宣言する場合、さまざまなタイプの入力を指定できます。利用可能なパラメータータイプとその説明を次に示します。

数値パラメーター

  • int: 数値入力を表示し、数値になります。int は 32 ビットの数値に制限されます。
  • bigint: int と似ていますが、より大きな値を扱えます。
  • double: 10 進数を許可します。

数値パラメーターの正確性は、フロントエンドで検証されます。

文字列パラメーター

  • string: 自由形式のテキストボックスで、テキスト値になります。

リストパラメーター

  • int_list: カンマ区切りの整数を入力し、クエリ内でカンマ区切りの整数になります。
  • string_list: int_list と似ていますが、文字列用です。

特定の ID パラメーター

  • post_id: 数値入力。クエリを実行する前に、指定された投稿がフォーラムに存在することを確認します。
  • topic_id: トピックの場合は post_id と同様です。
  • badge_id: 指定されたバッジが存在することを確認します。

ブールパラメーター

  • boolean: チェックボックスを表示します。
  • null boolean: ドロップダウンを表示し、空の入力を許可します。

時間パラメーター

  • time: タイムピッカー入力を表示します。
  • date: 日付ピッカー入力を表示します。
  • datetime: 日付と時刻の両方を含む入力ボックスを表示します。

セレクターパラメーター

  • user_id: Discourse ユーザーセレクターボックスを表示し、数値のユーザー ID になります。
  • user_list: user_id と似ていますが、複数のユーザーを許可し、数値のユーザー ID のカンマ区切りリストになります。
  • group_id: ユーザーの場合は user_id と似ていますが、グループ用です。
  • group_list: グループの場合は user_list と似ていますが、グループ用です。
  • category_id: カテゴリの場合は user_id と似ていますが、カテゴリ用です。

内部パラメーター

  • current_user_id: 入力 UI なし。クエリを実行しているユーザーのユーザー ID に変数を自動的に設定します。

リストパラメーターの使用

リストパラメーター (int_liststring_listuser_list) を使用する場合は、構文エラーを避けるために特別な注意が必要です。リストパラメーターを正しく使用する例を次に示します。

-- [params]
-- user_list :the_user_ids
SELECT SUM(length(bio_raw))
FROM user_profiles
WHERE user_id IN (:the_user_ids)

Null パラメーター

パラメータータイプに null をプレフィックスとして付けることで、空の入力を許可することもできます。これは、クエリを実行するときにそのパラメーターに値を指定する必要がないことを意味します。

このようなパラメーターを宣言する例を次に示します。

-- [params]
-- null int :null_int
-- null boolean :null_boolean
-- null string :null_string
-- null current_user_id :me

上記の SQL では、null_intnull_booleannull_string は、クエリを実行するときに空にできるパラメーターです。

これらのタイプのパラメーターをクエリでどのように使用できるかを見てみましょう。

-- [params]
-- null int :post_id
-- null string :username
SELECT *
FROM users
WHERE (id = :post_id OR :post_id IS NULL)
AND (username = :username OR :username IS NULL)

このクエリでは、post_id または username が提供されない場合(つまり、null のままの場合)、クエリはその WHERE 句の部分を無視します。これにより、一部の条件がオプションである、より柔軟なクエリが可能になります。

フロントエンドの検証

ほとんどのタイプのパラメーターはフロントエンドで検証されます。これらの検証には、必須だが入力されていない入力、無効な数値入力、存在しないカテゴリやグループ、形式が不適切な時刻などが含まれます。無効な入力の場合、エラーの理由がフォームに表示され、クエリ実行操作は拒否されます。

その他の例

さまざまなタイプのパラメーターを宣言するその他の例を次に示します。

-- [params]
-- int             :int = 3
-- bigint          :bigint = 12345678912345
-- boolean         :boolean
-- null boolean    :boolean_three = #null
-- string          :string = little bunny foo foo
-- date            :date = 14 jul 2015
-- time            :time = 5:02 pm
-- datetime        :datetime = 14 jul 2015 5:02 pm
-- double          :double = 3.1415
-- string          :inet = 127.0.0.1/8
-- user_id         :user_id = system
-- post_id         :post_id = http://localhost:3000/t/adsfdsfajadsdafdsds-sf-awerjkldfdwe/21/1?u=system
-- topic_id        :topic_id = /t/-/21
-- int_list        :int_list = 1,2,3
-- string_list     :string_list = a,b,c
-- category_id     :category_id = meta
-- group_id        :group_id = admins
-- user_list       :mul_users = system,discobot
-- current_user_id :me 

このシリーズのその他のトピック

「いいね!」 17

これらの素晴らしいガイドをありがとうございます。投稿してくださった @SaraDev さん :slight_smile: :hugs:

「いいね!」 6

@AlexDev
WHERE句のフィールド名をパラメータにすることはできますか?よろしくお願いします。
または、SQLステートメント全体をパラメータとして /admin/plugin/explorer/queries/id/run RESTエンドポイントから渡すことはできますか?

PSA: パラメータ名に数字を使用することはできません。例:「foo123」は失敗します。

-- [params]
-- string       :foo123 = a

SELECT :foo123

結果:

PG::SyntaxError: ERROR:  syntax error at or near ":"
LINE 10: SELECT :foo123
                ^
「いいね!」 4

run エンドポイントに次のような JSON ペイロードのパラメータで POST 呼び出しを試しました。

payload = {
    "params": {
        "request_post_id": "45"
    },
    "explain": False
}

ペイロードは Chrome の開発者ツールのペイロードからリバースエンジニアリングしました。
なぜか 500 サーバーエラーが返ってきます。

どなたか助けていただけますでしょうか?

PSA: これは最近追加されました

「いいね!」 2