gpt4 book ai didi

graphql - 如何使用 graphql 更新集合中的所有记录

转载 作者:行者123 更新时间:2023-12-02 16:46:16 24 4
gpt4 key购买 nike

我正在使用 Graph.cool graphql 作为服务,并且想知道如何对集合进行批量更新,类似于 SQL 更新。

就我而言,我需要更新数据库的 imageUrl 列中的 url 后缀。我需要将 {someid}_sm.jpg 替换为 {someid}_lg.jpg

如何使用 graphql 突变来做到这一点?我不想再次重新加载整个数据集,并且正在寻找一种不涉及使用 graphql 客户端手动交互整个列表的方法。

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

最佳答案

迁移脚本

最好的方法确实是使用结合 multiple mutations 的迁移脚本因此只有一个 HTTP 请求发送到 GraphQL 后端。

考虑这个架构:

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

我们可以使用 GraphQL 别名在一个请求中多次包含相同的突变:

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

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

我们将在迁移脚本中使用此机制。我将用 Lokka 来描述它和 Node,但是您可以选择您喜欢的任何语言和 GraphQL 客户端。

首先,我们查询所有现有图像以获取其 idname:

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

return result.images
}

然后,我们相应地替换名称,并构建一个大请求,其中包括必要的 updateImage 突变,并为每个请求使用不同的 GraphQL 别名。

如果您的图像名称可能在问题中提到的 {someid} 部分中包含字符串 sm,则此脚本将中断!这种情况请相应调整。

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)
}

就是这样。如果您必须更新数千张图像,则以一百张为一组对突变进行批处理可能比在一个请求中对所有图像进行批处理更好。请注意mutations run sequentially在 GraphQL 服务器上。

运行迁移

目前,我建议使用以下工作流程来运行迁移:

  • 克隆您的项目
  • 在克隆的项目上运行迁移脚本
  • 验证迁移是否成功运行。仔细检查:)
  • 在原始项目上运行迁移

您可以找到代码和进一步说明here .

虽然这种方法非常适合像您的示例中那样简单的迁移,但它并不适合所有情况。我们已经在考虑为此用例创建集成体验,例如 Graphcool 项目中的交互式迁移,以及模拟迁移、检查等。如果您有建议,请通过Slack告诉我.

关于graphql - 如何使用 graphql 更新集合中的所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41688883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com