GraphQL.cz/Fórum/Můžu v GraphQL kombinovat hromadné dotazy a mutace? Jak na to?

Můžu v GraphQL kombinovat hromadné dotazy a mutace? Jak na to?

Zdravím všechny, zajímalo by mě, jestli je možné v GraphQL nějakým způsobem kombinovat hromadné dotazy s mutacemi. Mám na mysli situace, kdy bych chtěl například načíst nějaká data z databáze pomocí dotazu a zároveň provést pár mutací, abych upravil nebo přidal nové záznamy. Existují nějaké osvědčené postupy, jak tohle udělat efektivně? Jak bych měl strukturovat svůj dotaz, aby bylo možné provádět obě akce najednou? Vím, že GraphQL má docela flexibilní syntaxi, ale nevím si rady, jak to skloubit dohromady. Je to vůbec dobrý nápad? Nemůže to mít negativní dopad na výkon nebo na strukturu API? A co caching? Mám se bát nějakých problémů s tímto přístupem? Hledal jsem už informace v dokumentaci, ale nic jsem nenašel. Zajímají mě také příklady z praxe, pokud někdo něco takového už zkoušel. Díky moc za jakoukoliv radu!

133 slov
1.3 minut čtení
6. 11. 2022
Bohumil Košťál

Jasně, v GraphQL to jde. Můžeš udělat víc věcí najednou s jedním dotazem díky tomu, že GraphQL podporuje víc operací v rámci jednoho requestu. Takže klidně můžeš mít dotaz na data a k tomu mutace. Jen si dej pozor, jak to strukturuješ, protože se ti to může pak dost zkomplikovat. Obvykle je dobré oddělovat čtení a zápis - to známe i z REST. Pokud ale máš důvod, proč bys chtěl dělat oboje najednou, tak můžeš použít fragmenty nebo si vytvořit vlastní resolver, který to všechno poskládá dohromady.

Co se týče výkonu, můžeš narazit na nějaké problémy, hlavně pokud máš složitější dotazy a hodně dat k manipulaci. Zas by ti to mělo ušetřit pár requestů, takže je to o tom zvážit priority. A ohledně cache, pokud uděláš mutaci, tak většinou cache nefunguje tak jako u dotazů, takže na to pozor. Mělo bys taky mít promyšleno, jak se ti to všechno synchronizuje po změnách v datech.

Někdo to dělá tak, že po mutaci spustí nový dotaz na aktualizaci dat, což není ideální, ale někdy je to prostě nutný zlo. Zkrátka je to o tom testovat a zjistit, co ti funguje nejlíp.

188 slov
1.9 minut čtení
1. 7. 2024
Magdaléna Horálková

Jo, v GraphQL můžeš kombinovat dotazy a mutace v jednom požadavku. To se dělá pomocí "batched operations", což znamená, že pošleš jeden dotaz, který obsahuje jak query, tak mutation. Tohle je fajn, když potřebuješ na jedný stránce načíst data a zároveň udělat nějaký změny.

Taky si dej pozor na to, co vlastně potřebuješ. Když uděláš mutaci a pak dotaz na data, tak můžeš dostat starý hodnoty, pokud nemáš dobře nastavený caching. Je dobrý mít to promyšlený, abys nevytvářel zmatek s datama.

Prakticky to vypadá nějak takhle: v těle požadavku prostě přidáš mutaci a pak dotaz. Například:

mutation \{
  createUser(name: "John") \{
    id
  \}
\}
query \{
  users \{
    id
    name
  \}
\}

Takhle můžeš efektivně povolat obě akce najednou. Co se výkonu týče, pokud to budeš dělat rozumně a nebudeš dělat moc složitý operace v jedné dávce, tak by to mělo být ok. Hlavně si ale dej pozor na případné race conditions a podobný věci.

Takže ano, je to možný a používaný, ale vždycky zvažuj, jestli to dává smysl pro tvůj konkrétní případ.

179 slov
1.8 minut čtení
6. 4. 2024
Radek Eliáš

Jo, jde to, ale je to trochu tricky. V GraphQL můžeš kombinovat dotazy a mutace, ale musíš na to jít chytře. Můžeš třeba udělat mutace a pak v rámci stejnýho requestu provést dotaz na ty změněný data. Ale pozor, ve standardním GraphQL neexistuje něco jako hromadný operace, takže se musíš ujistit, že toho neuděláš moc najednou.

Když to chceš spojit, tak si můžeš vytvořit custom resolver, který nejdřív zvládne mutace a pak vrátí ty načtený data. Performance může být trošku problém, protože pokud ti jedna část selže, tak se všechno zruší. A s cachingem to může být ještě horší – pokud se mění data, co už máš v cache, tak se ti to může zkomplikovat.

Příklad z praxe? Třeba když děláš registraci uživatele a chceš hned načíst profilový info. Tak bys mohl udělat mutaci pro vytvoření uživatele a pak dotaz na jeho profil v jednom requestu. Ale ideál je spíš mít to odděleně, aby ses vyhnul komplikacím s chybama nebo výkonem.

160 slov
1.6 minut čtení
4. 6. 2023
Josef Šimůnek
GraphQL.cz/Články/Batching dotazů
Praktické příklady hromadění dotazů v reálných aplikacíchObjevte, jak efektivně implementovat hromadění dotazů ve vašich aplikacích založených na GraphQL. Přečtěte si praktické příklady a tipy pro optimaliza...
1000 slov
10 minut čtení
28. 5. 2021
Pavel Kratochvíl
Přečíst článek
Podobné otázky