`productSet`と`customerSet`のミューテーションがupsertsとカスタムIDをサポートするようになりました

ShopifyのAPI開発を担当する方々にとって、データの更新と新規作成を効率的に行う方法は重要な課題の一つです。GraphQL Admin APIの`productSet`と`customerSet`ミューテーションによるデータ操作は、その一環となる機能です。

しかし、これまでのバージョンでは、既存のレコードが存在するかどうかを確認するための追加のクエリが必要であり、それがパフォーマンスやコストに影響を与えていました。また、`customerSet`ミューテーションはAPIの`unstable`バージョンでのみリリースされていました。

新バージョンの技術的ソリューション

2025-04バージョンでは、これらの課題が解決されます。`productSet`と`customerSet`ミューテーションは、`identifier`を使用してレコードをアップサート(存在すれば更新、存在しなければ作成)できるようになりました。

`identifier`が提供されると、これらのミューテーションは既存のレコードをチェックし、存在すれば`input`で提供されるデータで更新します。存在しない場合は新しいレコードを作成します。

これにより、開発者は追加のクエリを行うことなく、同じ形状の入力でレコードを作成し、その後更新するための直感的で冪等性のあるメカニズムを得ることができます。`productSet`は`handle`、`id`、`customId`を、`customerSet`は`phone`、`email`、`customId`を識別子として使用できます。

これは、`productSet`の既存の振る舞いを拡張したものであり、`input`に`id`が提供されている場合にレコードを更新し、それ以外の場合は新しいレコードを作成します。

実装手順とコード例

以下に具体的なコード例を示します。まず、`productSet`ミューテーションの場合は以下のようになります。

mutation {
  productSet(input: { id: "gid://shopify/Product/1234567890", title: "New Product Title" }) {
    product {
      id
      title
    }
  }
}

`customerSet`ミューテーションの場合は以下のようになります。

mutation {
  customerSet(input: { email: "test@example.com", firstName: "FirstName", lastName: "LastName" }) {
    customer {
      id
      email
      firstName
      lastName
    }
  }
}

パフォーマンス・コスト分析

この新機能により、レコードの存在チェックに必要な追加クエリが削減され、結果的にパフォーマンスが改善されます。また、APIのコール数が減少するため、コストも削減されます。

実装時の注意点・ベストプラクティス

ただし、新規作成と更新を同一の操作で行うupsertsは、データの整合性を保つために注意が必要です。特に、同時に複数のリクエストが発生する可能性がある場合や、トランザクションが必要な場合には、適切なエラーハンドリングとリトライロジックを実装することが重要です。

次のステップ・発展案

さらなるパフォーマンス改善やコスト削減を目指す場合、カスタムIDを活用することを検討してみてください。カスタムIDを使用する方法については、こちらの記事を参照してください。

参考記事: `productSet` and `customerSet` mutations now support upserts and custom IDs