AppMaster offre des fonctionnalités étendues pour travailler avec la base de données. Par exemple, à l'aide du bloc Rechercher, vous pouvez trouver les données nécessaires, y attacher des tables associées, les trier dans le bon ordre, etc. Cependant, dans certaines situations, cela peut ne pas suffire, et alors le bloc SQL Exec vient à la rescousse. Il vous permet d'exécuter n'importe quelle requête de base de données en utilisant toute la puissance de SQL.
Considérons le fonctionnement du bloc en utilisant l'exemple d'une base de données contenant un catalogue de livres.
Faisons un petit travail de préparation. Il est nécessaire de créer un processus métier qui, dans sa forme la plus simple, permettrait d'envoyer des demandes, ainsi que de recevoir leurs résultats.
Vous devrez également créer un point de terminaison qui vous permettra d'accéder à ce processus métier.
Au stade initial, cela devrait suffire. Vous pouvez publier votre application et passer aux tests. Pour cela, il est très pratique d'utiliser Swagger, qui est automatiquement créé lors de la publication.
Nous utilisons une requête simple qui devrait demander tous les livres de la base de données.
SELECT * FROM public.book
Veuillez noter que la table elle-même (comme toutes les autres tables créées dans l'éditeur de base de données) possède un préfixe indiquant le schéma - public.
Vous pouvez vérifier que la demande a été complétée avec succès et que le résultat a été reçu.
Mais le problème est qu’il est très difficile de percevoir la réponse sous cette forme. Une solution possible consiste à modifier légèrement la demande et à n'y laisser que les champs nécessaires, par exemple le titre du livre et le nombre de pages. De plus, il serait raisonnable de fixer une limite, de ne pas demander tous les livres de la base de données, mais de se limiter à dix.
SELECT nom, pages FROM public.book LIMITE 10
Bien mieux, mais toujours pas adapté à une utilisation réelle. Après tout, dans un processus métier, vous devez non seulement recevoir une demande, mais aussi faire quelque chose avec son résultat. Pour cela, il ne suffit pas d’avoir le résultat sous forme de texte ; vous devez le transformer en un modèle adapté à une utilisation ultérieure.
Pour ce faire, revenons au processus métier et affinons-le un peu. Dans le bloc de fin, nous ajouterons une nouvelle variable : un tableau de modèles de livres.
Vous aurez également besoin d'un bloc qui convertira le JSON reçu à la suite de la requête en modèle. Désérialisez JSON en modèle.
Répétons la demande précédente et veillons à ce que le résultat soit devenu beaucoup plus adapté, à la fois pour la perception visuelle et pour une utilisation ultérieure en BP.
Maintenant, nous pouvons passer à une logique plus complexe. Créons un processus métier qui :
- Reçoit le titre du livre en entrée.
- Détermine à quelle catégorie (genre) il appartient.
- Renvoie en conséquence 3 livres aléatoires de la même catégorie (dans ce cas, le livre de la requête ne doit pas en faire partie)
Pour ce faire, nous allons créer un nouveau processus métier qui combine la recherche à l'aide de blocs standards et l'utilisation de requêtes SQL.
La première étape consiste à rechercher un livre par son titre, et également à déterminer à quelles catégories il appartient. Pour ce faire, nous utilisons le bloc de recherche avec les paramètres suivants :
- _With = Catégories - en plus du livre lui-même, le résultat de la requête nécessite des informations de la table des catégories associée.
- _Limit = 1 - un seul livre doit être trouvé.
- _Ilike = False - le nom doit correspondre exactement à celui demandé.
- Nom - index du titre du livre, transmis depuis le bloc Démarrer.
En utilisant le bloc Array Element d'index 0, nous prenons le premier (et unique) livre du résultat.
Un livre peut appartenir à plusieurs catégories différentes à la fois, et dans ce cas, n’importe laquelle d’entre elles nous conviendra. Il peut être sélectionné aléatoirement à l'aide du bloc d'éléments aléatoires
Après cela, nous avons toutes les données nécessaires, et il ne reste plus qu'à créer la requête elle-même, qui peut ressembler à ceci :
SELECT * FROM public.book WHERE id IN (SELECT rel1_id FROM public.book_categorys_category_books_pivot WHERE book_categorys_category_books_pivot.rel2_id = X) AND id <> Y ORDER BY random() LIMIT 3
Où X est l'identifiant de la catégorie du livre et Y est l'identifiant du livre lui-même.
Veuillez noter que cette requête inclut une sous-requête. Tout d'abord, à partir de la table book_categorys_category_books_pivot (elle est utilisée pour stocker des informations sur les relations entre deux tables), tous les identifiants de livres correspondant à la catégorie sélectionnée sont trouvés. Après cela, une requête est exécutée qui trouve 3 livres aléatoires correspondant à la plage spécifiée, à l'exclusion de l'ID du livre, dont le titre a été initialement transmis au processus métier.
Pour une étude plus détaillée de la structure de la base de données du projet, vous pouvez utiliser le bouton Ouvrir la base de données dans les paramètres des plans de déploiement.
Il vous permettra d'ouvrir la base de données dans l'éditeur et d'accéder directement à la visualisation et à l'édition des données. Cependant, vous devez être prudent et prendre en compte le fait que la modification de la structure des données elle-même dans l'éditeur rendra impossible la publication ultérieure du projet.
Revenons à la création d'un processus métier. Il est nécessaire de terminer la compilation de la requête et pour ce faire, de convertir l'ID du livre et de la catégorie d'un entier en chaîne et également d'assembler la requête finale à l'aide du bloc Concat Strings (Multiple).
La dernière étape consiste à exécuter la requête, à convertir le résultat en modèle et à l'envoyer au bloc End en tant que résultat de la requête.
Vous pouvez enregistrer vos modifications, créer un point de terminaison, publier votre projet et vérifier que la requête fonctionne correctement. Dans ce cas, un bloc SQL Exec avec une requête composée complexe a été utilisé pour remplacer de nombreux autres blocs et simplifier la structure du processus métier.
L'utilisation du bloc SQL Exec ne se limite pas à la récupération de données et peut être utilisée dans une grande variété de scénarios. Examinons de plus près quelques options supplémentaires.
- Compter le nombre de commentaires pour un livre avec id=X
SELECT COUNT(id) FROM public.comment WHERE book_id = X - Calcul de la note moyenne d'un livre, en tenant compte de toutes les notes données dans les commentaires :
SELECT AVG(rate) FROM public.comment WHERE book_id = X - Suppression de tous les commentaires écrits avant 2023 (peut être utilisé, par exemple, pour effacer rapidement le journal).
DELETE * FROM public.comment OÙ créé_at < '2023-01-01'
En conclusion, il convient de noter que pour améliorer la sécurité, un filtre a été ajouté au bloc SQL Exec pour les opérations dangereuses pouvant conduire à des modifications de schéma.
CREATE/ALTER/DROP/TRUNCATE pour TABLE|COLUMN|INDEX|CONSTRAINT|SEQUENCE|SCHEMA|DATABASE sont désactivés par le filtre si l'application est hébergée sur les serveurs AppMaster. Lors de l'hébergement sur site, par défaut, toutes les demandes sont disponibles sans restrictions.