graphql-implementation について
スキーマ設計、リゾルバー、パフォーマンスに取り組む開発者向けの GraphQL API 実装ガイドです。Apollo Server と Python Graphene の例に加え、入力検証、エラー処理、N+1 クエリの回避方法を扱います。
主な機能
- 01スキーマとリゾルバーの定義
- 02Apollo Server のセットアップ
- 03DataLoader によるクエリの一括処理
- 04GraphQLError によるエラー処理
- 05クエリ複雑度の制限
- 06Graphene と Flask の統合
活用シーン
- 01Apollo Server での GraphQL API 構築
- 02DataLoader による N+1 クエリの回避
- 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 クエリの問題を無視します
- 認可されていないデータを返します
- 入力検証を省略します
コメント
Markdown 対応