mcpField
G
graphql-implementation

graphql-implementation

github.com/secondsky開発242388 回インストール5 週間前に更新
リポジトリ

graphql-implementation について

スキーマ設計、リゾルバー、パフォーマンスに取り組む開発者向けの GraphQL API 実装ガイドです。Apollo Server と Python Graphene の例に加え、入力検証、エラー処理、N+1 クエリの回避方法を扱います。

主な機能

  1. 01スキーマとリゾルバーの定義
  2. 02Apollo Server のセットアップ
  3. 03DataLoader によるクエリの一括処理
  4. 04GraphQLError によるエラー処理
  5. 05クエリ複雑度の制限
  6. 06Graphene と Flask の統合

活用シーン

  1. 01Apollo Server での GraphQL API 構築
  2. 02DataLoader による N+1 クエリの回避
  3. 03入力検証と API エラーの整備

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/secondsky/claude-skills --skill graphql-implementation

インストール後、Claude Code で/graphql-implementationを入力して読み込まれたか確認します。

同梱ファイルreferences/python-graphene.md

詳細

GraphQL の実装

適切なスキーマ設計、リゾルバー、パフォーマンス最適化により、GraphQL API を構築します。

スキーマ定義

type User {
  id: ID!
  name: String!
  email: String!
  posts(limit: Int = 10): [Post!]!
}

type Post {
  id: ID!
  title: String!
  content: String!
  author: User!
  createdAt: DateTime!
}

type Query {
  user(id: ID!): User
  users(limit: Int, offset: Int): [User!]!
  post(id: ID!): Post
}

type Mutation {
  createUser(input: CreateUserInput!): User!
  createPost(input: CreatePostInput!): Post!
}

input CreateUserInput {
  name: String!
  email: String!
}

Apollo Server のセットアップ

const { ApolloServer } = require('@apollo/server');
const { startStandaloneServer } = require('@apollo/server/standalone');

const resolvers = {
  Query: {
    user: (_, { id }, { dataSources }) =>
      dataSources.userAPI.getUser(id),
    users: (_, { limit, offset }, { dataSources }) =>
      dataSources.userAPI.getUsers({ limit, offset })
  },
  User: {
    posts: (user, { limit }, { dataSources }) =>
      dataSources.postAPI.getPostsByUser(user.id, limit)
  },
  Mutation: {
    createUser: (_, { input }, { dataSources }) =>
      dataSources.userAPI.createUser(input)
  }
};

const server = new ApolloServer({ typeDefs, resolvers });

N+1 問題を防ぐ DataLoader

const DataLoader = require('dataloader');

const userLoader = new DataLoader(async (ids) => {
  const users = await User.find({ _id: { $in: ids } });
  return ids.map(id => users.find(u => u.id === id));
});

エラー処理

const { GraphQLError } = require('graphql');

throw new GraphQLError('User not found', {
  extensions: { code: 'NOT_FOUND', argumentName: 'id' }
});

ベストプラクティス

  • DataLoader を使ってクエリをバッチ処理します
  • クエリの複雑さに上限を設けます
  • クライアントのニーズに合わせてスキーマを設計します
  • すべての入力を検証します
  • 説明的な命名規則を使用します

Python Graphene

完全な Flask 実装については、references/python-graphene.md を参照してください。以下が含まれます:

  • ObjectType の定義
  • Query クラスと Mutation クラス
  • 入力型
  • Flask との統合

ベストプラクティス

推奨事項:

  • DataLoader を使ってクエリをバッチ処理します
  • クエリの複雑さに上限を設けます
  • クライアントのニーズに合わせてスキーマを設計します
  • すべての入力を検証します
  • 説明的な命名規則を使用します
  • リアルタイムデータ向けにサブスクリプションを追加します

避けるべきこと:

  • 上限のない深くネストされたクエリを許可します
  • データベースの内部情報を公開します
  • N+1 クエリの問題を無視します
  • 認可されていないデータを返します
  • 入力検証を省略します

コメント