2017-01-17 2 views
2

Ich benutze Graph.cool graphql als Dienst und frage mich, wie eine Massenaktualisierung für die Sammlung, ähnlich wie bei einem SQL-Update.So aktualisieren Sie alle Datensätze in einer Sammlung mit graphql

In meinem Fall muss ich das Suffix einer URL in der imageUrl-Spalte meiner Datenbank aktualisieren. Ich muss ein {etwas} _sm.jpg zu {etwas} _lg.jpg tauschen

Wie mache ich das mit einer graphql Mutation? Ich möchte das gesamte Dataset nicht noch einmal neu laden und suche nach einer Möglichkeit, dies zu tun, ohne manuell die gesamte Liste mit einem graphql-Client zu interoperieren.

mutation { 
    updatePost() // what goes here? 
} 
+2

"durch die gesamte Liste" - das ist so ziemlich der richtige Weg. Ich fügte stattdessen eine Feature-Anfrage für das hinzu, was Sie im Sinn hatten: https://github.com/graphcool/feature-requests/issues/67 Ich kann Ihnen beim Einrichten des Skripts helfen. – marktani

Antwort

2

Migration Skript

Der beste Ansatz ist in der Tat ein Migrationsskript zu verwenden, die multiple mutations so nur eine HTTP-Anforderung kombiniert an das Backend GraphQL gesendet wird.

Betrachten Sie dieses Schema:

type Image { 
    id: ID! 
    name: String! 
} 

Wir können die gleiche Mutation mehrmals in einer Anfrage mit GraphQL Aliase sind:

mutation { 
    first: updateImage(id: "first-id", name: "01_lg.jpg") { 
    id 
    name 
    } 

    second: updateImage(id: "second-id", name: "02_lg.jpg") { 
    id 
    name 
    } 
} 

Wir Verwendung dieses Mechanismus in unserem Migrationsscript machen würden. Ich werde es mit Lokka und Node beschreiben, aber Sie können wählen, welche Sprache und GraphQL Client Sie bevorzugen.

Zuerst fragen wir alle vorhandenen Bilder ihre id und name zu erhalten:

const queryImages = async() => { 
    const result = await client.query(`{ 
    images: allImages { 
     id 
     name 
    } 
    }`) 

    return result.images 
} 

Dann wir die Namen entsprechend ersetzen und eine große Anfrage einschließlich der notwendigen updateImage Mutationen mit einem anderen GraphQL Alias ​​für jedes Konstrukt.

Wenn Ihre Bildnamen möglicherweise die Zeichenfolge sm im Teil enthalten, der in Ihrer Frage erwähnt wird, wird dieses Skript beschädigt! In diesem Fall passen Sie bitte entsprechend an.

const migrateImages = async(images) => { 
    // beware! if your ids contain the string 'sm', adjust the string replacement accordingly! 
    const updateMutations = _.chain(images) 
    .map(image => ({ id: image.id, name: image.name.replace('sm', 'lg')})) 
    .map(image => ` 
     ${image.id}: updateImage(id: "${image.id}", name: "${image.name}") { 
     id 
     name 
     }`) 
    .value() 
    .join('\n') 

    const result = await client.mutate(`{ 
    ${updateMutations} 
    }`) 

    console.log(`Updated ${Object.keys(result).length} images`) 
    console.log(result) 
} 

Das ist es. Wenn Sie Tausende von Bildern aktualisieren müssen, ist es möglicherweise besser, die Mutationen in etwa hundert Gruppen zu mischen, als alle in einer Anforderung zu chargen. Beachten Sie, dass mutations run sequentially auf dem GraphQL-Server.

Ausführen der Migration

Derzeit schlage ich den folgenden Workflow die Migration für den Betrieb:

  • Clone Projekt
  • Führen Sie das Migrationsskript auf dem geklonten Projekt
  • Stellen Sie sicher, dass die Migration lief erfolgreich. Überprüfen :)
  • Führen Sie die Migration auf Ihrem ursprünglichen Projekt

Sie können den Code und weitere Anweisungen finden here.

Dieser Ansatz ist zwar ideal für Migrationen, die genauso einfach sind wie in Ihrem Beispiel, aber nicht für alle Situationen geeignet. Wir denken bereits darüber nach, eine integrierte Lösung für diesen Anwendungsfall zu erstellen, z. B. eine interaktive Migration direkt in Ihrem Graphcool-Projekt mit simulierten Migrationen, Prüfungen und mehr. Wenn Sie Vorschläge haben, lassen Sie mich in Slack wissen.

Verwandte Themen