Utilisation de paramètres dans les requêtes de Data Explorer

Les paramètres sont un outil puissant qui peut être utilisé dans les requêtes Data Explorer sur Discourse. Les paramètres permettent des requêtes plus dynamiques et personnalisables, et au lieu de coder en dur des valeurs dans vos requêtes, vous pouvez déclarer des variables qui demanderont une saisie lors de l’exécution de la requête.

Déclaration d’un paramètre

Pour déclarer un paramètre, vous pouvez utiliser la syntaxe suivante :

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

La section des paramètres de la requête commencera toujours par -- [params], suivie de chaque type de paramètre sur une nouvelle ligne, où parameter_name sera remplacé par le nom de votre paramètre.

Cela créera un champ où vous pouvez saisir différentes valeurs à chaque fois que vous exécutez la requête.

Types de paramètres

Lors de la déclaration de paramètres dans vos requêtes Data Explorer, vous pouvez spécifier différents types de saisie. Voici les types de paramètres disponibles et leurs descriptions :

Paramètres numériques

  • int : Affiche une saisie numérique, devient une valeur numérique. int est limité aux nombres sur 32 bits.
  • bigint : Similaire à int, mais peut être plus grand.
  • double : Permet les valeurs décimales.

La validité des paramètres numériques sera vérifiée côté client.

Paramètres de chaîne de caractères

  • string : Zone de texte libre, devient une valeur de texte.

Paramètres de liste

  • int_list : Saisir des entiers séparés par des virgules, devient des entiers séparés par des virgules dans la requête.
  • string_list : Similaire à int_list, mais pour les chaînes de caractères.

Paramètres d’ID spécifiques

  • post_id : Saisie numérique ; s’assure que le post spécifié existe sur le forum avant d’exécuter la requête.
  • topic_id : Similaire à post_id, mais pour les sujets.
  • badge_id : S’assure que le badge spécifié existe.

Paramètres booléens

  • boolean : Affiche une case à cocher.
  • null boolean : Affiche un menu déroulant, permettant une saisie vide.

Paramètres de temps

  • time : Affiche un sélecteur d’heure.
  • date : Affiche un sélecteur de date.
  • datetime : Affiche une boîte de saisie incluant à la fois la date et l’heure.

Paramètres de sélecteur

  • user_id : Affiche la boîte de sélecteur d’utilisateur Discourse et devient l’ID utilisateur numérique.
  • user_list : Similaire à user_id, mais permet plusieurs utilisateurs, devenant une liste d’ID utilisateurs numériques séparés par des virgules.
  • group_id : Similaire à user_id, mais pour les groupes.
  • group_list : Similaire à user_list, mais pour les groupes.
  • category_id : Similaire à user_id, mais pour les catégories.

Paramètres internes

  • current_user_id : Pas d’interface de saisie ; définit automatiquement la variable à l’ID utilisateur de l’utilisateur exécutant la requête

Utilisation des paramètres de liste

Lors de l’utilisation de paramètres de liste (int_list, string_list, user_list), une attention particulière doit être portée pour éviter les erreurs de syntaxe. Voici un exemple d’utilisation correcte d’un paramètre de liste :

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

Paramètres nuls

Vous pouvez également autoriser une saisie vide en préfixant le type de paramètre par null. Cela signifie qu’il n’est pas nécessaire de fournir une valeur pour ce paramètre lors de l’exécution de la requête.

Voici quelques exemples de la manière de déclarer de tels paramètres :

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

Dans le SQL ci-dessus, null_int, null_boolean et null_string sont des paramètres qui peuvent être laissés vides lors de l’exécution de la requête.

Voyons comment ces types de paramètres peuvent être utilisés dans une requête :

-- [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)

Dans cette requête, si post_id ou username n’est pas fourni (c’est-à-dire laissé sur null), la requête ignorera cette partie de la clause WHERE. Cela permet des requêtes plus flexibles où certaines conditions sont optionnelles.

Validation côté client

La plupart des types de paramètres seront validés côté client. Ces validations incluent les saisies obligatoires mais non remplies, les saisies numériques invalides, les catégories ou groupes inexistants, les heures mal formées, etc. Pour une saisie invalide, la raison de l’erreur sera affichée dans le formulaire et l’opération d’exécution de la requête sera rejetée.

Choix des types et utilisation des casts

En général, les paramètres devraient « fonctionner » dans vos requêtes. Pour les cas plus avancés, vous devrez peut-être ajouter un cast explicite ::type.

Par exemple, pour les intervalles, vous devez déclarer un paramètre de chaîne de caractères et le caster en intervalle. Les valeurs peuvent inclure des unités, telles que 2 day ou 3 hours :

-- [params]
-- string :lookback = 2 day

SELECT id AS topic_id, created_at
FROM topics
WHERE created_at >= NOW() - :lookback::interval

Certaines fonctions ont également besoin de types d’arguments explicites :

round(amount::numeric, :decimal_places::integer)
date_trunc('day', :start_date::timestamp)

Exemples supplémentaires

Voici quelques exemples supplémentaires de déclaration de différents types de paramètres :

-- [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 

Autres sujets de cette série

Ce sont d’excellents guides, merci de les avoir publiés @SaraDev :slight_smile: :hugs:

@AlexDev
un nom de champ dans la clause where peut-il être un paramètre ? merci
ou l’instruction sql entière peut-elle être un paramètre à passer à partir du point de terminaison /admin/plugin/explorer/queries/id/run

PSA : vous ne pouvez pas utiliser de chiffres dans les noms de vos paramètres, par exemple, « foo123 » échouera.

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

SELECT :foo123

résulte en

PG::SyntaxError: ERROR:  syntax error at or near ":"
LINE 10: SELECT :foo123
                ^

J’ai essayé d’appeler le point de terminaison run avec des paramètres dans la charge utile JSON comme suit :

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

J’ai rétro-conçu la charge utile à partir de l’onglet de développement de Chrome.
D’une manière ou d’une autre, je continue d’obtenir une erreur serveur 500.

Quelqu’un peut-il m’aider ?

PSA : ceci a été ajouté récemment par

Demande de fonctionnalité : Serait-il possible d’ajouter tag_group comme type de paramètre qui injecterait l’ID entier du groupe de balises sélectionné ?