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.
"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