Jedes Beispiel ist zugleich ein Test: der Katalog läuft im Testlauf gegen einen echten Server und muss sein hinterlegtes Ergebnis
liefern — was hier steht, ist genau das, was ausgeführt wird.
Abfragen
Zeilen mit Filter und Sortierung
Jede Tabelle ist ein Feld der Abfrage. where, orderBy, limit und offset stehen als Argumente; die Werte sind immer Parameter, nie Teil des SQL-Textes.
{ pruefstand_kunden(where: {Ort: {eq: "Bern"}}, orderBy: [{Name: DESC}]) { Id Name Ort } }
Erwartetes Ergebnis
Antwort
{"pruefstand_kunden":[{"Id":"3","Name":"Clara","Ort":"Bern"},{"Id":"1","Name":"Anna","Ort":"Bern"}]}distinct_on: je Ort der erste Kunde
T-SQL kennt kein DISTINCT ON; der Server übersetzt es in ROW_NUMBER() OVER (PARTITION BY …). Je Wertekombination bleibt die erste Zeile nach orderBy.
{ pruefstand_kunden(distinct_on: [Ort], orderBy: [{Ort: ASC}, {Id: ASC}]) { Ort Name } }
Erwartetes Ergebnis
Antwort
{"pruefstand_kunden":[{"Ort":"Bern","Name":"Anna"},{"Ort":"Zürich","Name":"Bruno"}]}Verschachtelung
Kunden mit ihren Bestellungen und deren Summe
Ein Fremdschlüssel ist in beide Richtungen ein Feld. Die Bestellungen aller Kunden kommen mit einer einzigen Abfrage, nicht mit einer je Kunde; das Aggregat rechnet die Datenbank, je Kunde.
{ pruefstand_kunden(orderBy: [{Id: ASC}]) {
Name
pruefstand_bestellungen(orderBy: [{Id: ASC}]) { Betrag }
pruefstand_bestellungen_aggregate { count sum { Betrag } }
} }
Erwartetes Ergebnis
Antwort
{"pruefstand_kunden":[{"Name":"Anna","pruefstand_bestellungen":[{"Betrag":"10.00"},{"Betrag":"20.50"}],"pruefstand_bestellungen_aggregate":{"count":2,"sum":{"Betrag":"30.50"}}},{"Name":"Bruno","pruefstand_bestellungen":[{"Betrag":"5.25"}],"pruefstand_bestellungen_aggregate":{"count":1,"sum":{"Betrag":"5.25"}}},{"Name":"Clara","pruefstand_bestellungen":[],"pruefstand_bestellungen_aggregate":{"count":0,"sum":{"Betrag":null}}}]}Mutationen
Einfügen und Löschen in einer Transaktion
Eine Mutation ist eine Transaktion: alle Wurzelfelder laufen nacheinander, scheitert eines, ist alles zurückgenommen. Dieses Beispiel legt einen Kunden an und löscht ihn wieder — und hinterlässt keine Spur.
mutation {
neu: insert_pruefstand_kunden(objects: [{Name: "Dora", Ort: "Basel"}]) { affected_rows returning { Name Ort } }
weg: delete_pruefstand_kunden(where: {Name: {eq: "Dora"}}) { affected_rows }
}
Erwartetes Ergebnis
Antwort
{"neu":{"affected_rows":1,"returning":[{"Name":"Dora","Ort":"Basel"}]},"weg":{"affected_rows":1}}