AppMaster bietet umfangreiche Möglichkeiten für die Arbeit mit der Datenbank. Mithilfe des Suchblocks können Sie beispielsweise die erforderlichen Daten finden, zugehörige Tabellen anhängen, in der richtigen Reihenfolge sortieren usw. In bestimmten Situationen reicht dies jedoch möglicherweise nicht aus, und dann kommt der SQL Exec-Block zum Einsatz die Rettung. Damit können Sie beliebige Datenbankabfragen mit der vollen Leistungsfähigkeit von SQL ausführen.
Betrachten wir die Funktionsweise des Blocks am Beispiel einer Datenbank, die einen Buchkatalog enthält.
Machen wir ein wenig Vorbereitungsarbeit. Es ist notwendig, einen Geschäftsprozess zu erstellen, der in seiner einfachsten Form das Senden von Anfragen sowie den Empfang ihrer Ergebnisse ermöglicht.
Sie müssen außerdem einen Endpunkt erstellen, der Ihnen den Zugriff auf diesen Geschäftsprozess ermöglicht.
Im Anfangsstadium sollte dies ausreichen. Sie können Ihre Anwendung veröffentlichen und mit dem Testen fortfahren. Hierfür ist es sehr praktisch, Swagger zu verwenden, der beim Veröffentlichen automatisch erstellt wird.
Wir verwenden eine einfache Abfrage, die alle Bücher aus der Datenbank abfragen soll.
WÄHLEN Sie * AUS public.book
Bitte beachten Sie, dass die Tabelle selbst (wie alle anderen im Datenbankeditor erstellten Tabellen) ein Präfix hat, das das Schema angibt – öffentlich.
Sie können überprüfen, ob die Anfrage erfolgreich abgeschlossen wurde und das Ergebnis eingegangen ist.
Das Problem ist jedoch, dass es sehr schwierig ist, die Antwort in dieser Form zu verstehen. Eine mögliche Lösung besteht darin, die Anfrage ein wenig zu modifizieren und nur die notwendigen Felder darin zu belassen – zum Beispiel den Titel des Buches und die Seitenzahl. Darüber hinaus wäre es sinnvoll, ein Limit festzulegen, nicht alle Bücher aus der Datenbank anzufordern, sondern sich auf zehn zu beschränken.
WÄHLEN Sie Namen, Seiten AUS public.book LIMIT 10
Viel besser, aber immer noch nicht für den echten Einsatz geeignet. Denn in einem Geschäftsprozess geht es nicht nur darum, eine Anfrage zu erhalten, sondern auch etwas mit dem Ergebnis zu tun. Dafür reicht es nicht aus, das Ergebnis in Textform zu haben; Sie müssen daraus ein Modell machen, das für die weitere Verwendung geeignet ist.
Gehen wir dazu noch einmal auf den Geschäftsprozess zurück und verfeinern ihn ein wenig. Im Endblock fügen wir eine neue Variable hinzu – ein Array von Buchmodellen.
Sie benötigen außerdem einen Block, der den als Ergebnis der Anfrage empfangenen JSON in ein Modell umwandelt. JSON zum Modell deserialisieren.
Wiederholen wir die vorherige Anfrage und stellen wir sicher, dass das Ergebnis viel besser geeignet ist, sowohl für die visuelle Wahrnehmung als auch für die weitere Verwendung bei BP.
Jetzt können wir zu einer komplexeren Logik übergehen. Lassen Sie uns einen Geschäftsprozess erstellen, der:
- Erhält den Titel des Buchs als Eingabe.
- Bestimmt, zu welcher Kategorie (Genre) es gehört.
- Gibt als Ergebnis 3 zufällige Bücher aus derselben Kategorie zurück (in diesem Fall sollte das Buch aus der Anfrage nicht darunter sein)
Dazu erstellen wir einen neuen Geschäftsprozess, der die Suche mithilfe von Standardblöcken und die Verwendung von SQL-Abfragen kombiniert.
Der erste Block besteht darin, ein Buch anhand seines Titels zu finden und außerdem zu bestimmen, zu welchen Kategorien es gehört. Dazu verwenden wir den Suchblock mit folgenden Parametern:
- _With = Kategorien – Zusätzlich zum Buch selbst erfordert das Abfrageergebnis Informationen aus der zugehörigen Kategorietabelle.
- _Limit = 1 – es muss nur ein Buch gefunden werden.
- _Ilike = False – der Name muss genau mit dem angeforderten Namen übereinstimmen.
- Name – Index des Buchtitels, übergeben vom Startblock.
Unter Verwendung des Array-Element-Blocks mit Index 0 nehmen wir das erste (und einzige) Buch aus dem Ergebnis.
Ein Buch kann gleichzeitig zu mehreren verschiedenen Kategorien gehören, und in diesem Fall passt jede davon zu uns. Es kann mithilfe des Zufallselementblocks zufällig ausgewählt werden
Danach haben wir alle notwendigen Daten und müssen nur noch die Anfrage selbst erstellen, die wie folgt aussehen könnte:
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
Dabei ist X die ID der Buchkategorie und Y die ID des Buches selbst.
Bitte beachten Sie, dass diese Abfrage eine Unterabfrage enthält. Zunächst werden in der Tabelle book_categorys_category_books_pivot (sie wird zum Speichern von Informationen über die Beziehungen zwischen zwei Tabellen verwendet) alle Buchkennungen gefunden, die der ausgewählten Kategorie entsprechen. Danach wird eine Abfrage ausgeführt, die zufällig drei Bücher findet, die dem angegebenen Bereich entsprechen, mit Ausnahme der Buch-ID, deren Titel ursprünglich an den Geschäftsprozess übergeben wurde.
Für eine detailliertere Untersuchung der Projektdatenbankstruktur können Sie die Schaltfläche „Datenbank öffnen“ in den Einstellungen für Bereitstellungspläne verwenden.
Damit können Sie die Datenbank im Editor öffnen und direkten Zugriff auf die Anzeige und Bearbeitung von Daten erhalten. Sie sollten jedoch vorsichtig sein und berücksichtigen, dass eine Änderung der Datenstruktur selbst im Editor eine weitere Veröffentlichung des Projekts unmöglich macht.
Kehren wir zum Erstellen eines Geschäftsprozesses zurück. Es ist notwendig, die Kompilierung der Anfrage abzuschließen und dazu die Buch- und Kategorie-ID von einer Ganzzahl in eine Zeichenfolge umzuwandeln und außerdem die endgültige Anfrage mithilfe des Concat Strings (Multiple)-Blocks zusammenzustellen.
Der letzte Schritt besteht darin, die Abfrage auszuführen, das Ergebnis in ein Modell umzuwandeln und es als Abfrageergebnis an den Endblock zu senden.
Sie können Ihre Änderungen speichern, einen Endpunkt erstellen, Ihr Projekt veröffentlichen und überprüfen, ob die Anfrage ordnungsgemäß funktioniert. In diesem Fall wurde ein SQL Exec-Block mit einer komplexen zusammengesetzten Abfrage verwendet, um viele andere Blöcke zu ersetzen und die Struktur des Geschäftsprozesses zu vereinfachen.
Die Verwendung des SQL Exec-Blocks ist nicht auf den Datenabruf beschränkt und kann in den unterschiedlichsten Szenarien eingesetzt werden. Schauen wir uns noch ein paar weitere Optionen genauer an.
- Zählen der Anzahl der Kommentare für ein Buch mit der ID=X
SELECT COUNT(id) FROM public.comment WHERE book_id = X - Berechnung der durchschnittlichen Bewertung eines Buches unter Berücksichtigung aller in den Kommentaren abgegebenen Bewertungen:
SELECT AVG(rate) FROM public.comment WHERE book_id = X - Löschen aller Kommentare, die vor 2023 geschrieben wurden (kann beispielsweise zum schnellen Löschen des Protokolls verwendet werden).
DELETE * FROM public.comment WHEREcreated_at < '2023-01-01'
Abschließend ist anzumerken, dass zur Verbesserung der Sicherheit dem SQL Exec-Block ein Filter für gefährliche Vorgänge hinzugefügt wurde, die zu Schemaänderungen führen können.
CREATE/ALTER/DROP/TRUNCATE für TABLE|COLUMN|INDEX|CONSTRAINT|SEQUENCE|SCHEMA|DATABASE werden durch den Filter deaktiviert, wenn die Anwendung auf AppMaster-Servern gehostet wird. Beim Hosting vor Ort sind standardmäßig alle Anfragen ohne Einschränkungen verfügbar.