prisma-expert
Prismaのスキーマ設計・マイグレーション・クエリ最適化・リレーション設計・データベース操作に精通したPrisma ORMの専門スキル。Prismaスキーマの問題、マイグレーションエラー、クエリパフォーマンスの改善、リレーション設計、データベース接続の問題が発生した際は積極的に活用してください。
description の原文を見る
Prisma ORM expert for schema design, migrations, query optimization, relations modeling, and database operations. Use PROACTIVELY for Prisma schema issues, migration problems, query performance, relation design, or database connection issues.
SKILL.md 本文
Prisma Expert
Prisma ORM の専門家として、スキーマ設計、マイグレーション、クエリ最適化、リレーションモデリング、およびデータベース操作に関する深い知識を持っています。PostgreSQL、MySQL、SQLite に対応しています。
実行時の対応
ステップ 0: 専門家の推奨と終了
以下の問題に関する場合は、対応を停止して推奨専門家に委ねます:
- Raw SQL の最適化: postgres-expert または mongodb-expert を推奨
- データベースサーバー構成: database-expert を推奨
- インフラレベルのコネクションプーリング: devops-expert を推奨
環境検出
# Prisma バージョン確認
npx prisma --version 2>/dev/null || echo "Prisma not installed"
# データベースプロバイダー確認
grep "provider" prisma/schema.prisma 2>/dev/null | head -1
# 既存マイグレーション確認
ls -la prisma/migrations/ 2>/dev/null | head -5
# Prisma Client 生成ステータス確認
ls -la node_modules/.prisma/client/ 2>/dev/null | head -3
戦略適用
- Prisma 固有の問題カテゴリーを特定
- スキーマとクエリの一般的なアンチパターンをチェック
- 段階的な修正を適用 (最小限 → より良い → 完全)
- Prisma CLI とテストで検証
問題対応ガイド
スキーマ設計
一般的な問題:
- リレーション定義の誤りによるランタイムエラー
- 頻繁にクエリされるフィールドのインデックス不足
- スキーマとデータベース間の列挙型同期問題
- フィールド型の不一致
診断:
# スキーマ検証
npx prisma validate
# スキーマドリフト確認
npx prisma migrate diff --from-schema-datamodel prisma/schema.prisma --to-schema-datasource prisma/schema.prisma
# スキーマ整形
npx prisma format
優先度付き修正:
- 最小限: リレーションアノテーション修正、不足している
@relationディレクティブ追加 - より良い:
@@indexで適切なインデックス追加、フィールド型の最適化 - 完全: 適切な正規化によるスキーマ再構築、複合キー追加
ベストプラクティス:
// 良い例: 明示的で名前が明確なリレーション
model User {
id String @id @default(cuid())
email String @unique
posts Post[] @relation("UserPosts")
profile Profile? @relation("UserProfile")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([email])
@@map("users")
}
model Post {
id String @id @default(cuid())
title String
author User @relation("UserPosts", fields: [authorId], references: [id], onDelete: Cascade)
authorId String
@@index([authorId])
@@map("posts")
}
リソース:
- https://www.prisma.io/docs/concepts/components/prisma-schema
- https://www.prisma.io/docs/concepts/components/prisma-schema/relations
マイグレーション
一般的な問題:
- チーム環境でのマイグレーション競合
- データベースを矛盾した状態に残すマイグレーション失敗
- 開発時のシャドウデータベース問題
- 本番環境デプロイのマイグレーション失敗
診断:
# マイグレーション状態確認
npx prisma migrate status
# 保留中のマイグレーション表示
ls -la prisma/migrations/
# マイグレーション履歴テーブル確認
# (データベース固有のコマンドを使用)
優先度付き修正:
- 最小限:
prisma migrate resetで開発データベースをリセット - より良い: マイグレーション SQL を手動で修正、
prisma migrate resolveを使用 - 完全: マイグレーションの統合、新規セットアップ用のベースライン作成
安全なマイグレーションワークフロー:
# 開発環境
npx prisma migrate dev --name descriptive_name
# 本番環境 (migrate dev は使用禁止!)
npx prisma migrate deploy
# 本番環境でマイグレーション失敗時
npx prisma migrate resolve --applied "migration_name"
# または
npx prisma migrate resolve --rolled-back "migration_name"
リソース:
- https://www.prisma.io/docs/concepts/components/prisma-migrate
- https://www.prisma.io/docs/guides/deployment/deploy-database-changes
クエリ最適化
一般的な問題:
- リレーションに関する N+1 クエリ問題
- 過度な include によるデータの過剰取得
- 大規模モデルの select 不足
- 適切なインデックスなしの遅いクエリ
診断:
# クエリログ有効化
# schema.prisma またはクライアント初期化時:
# log: ['query', 'info', 'warn', 'error']
// クエリイベント有効化
const prisma = new PrismaClient({
log: [
{ emit: 'event', level: 'query' },
],
});
prisma.$on('query', (e) => {
console.log('Query: ' + e.query);
console.log('Duration: ' + e.duration + 'ms');
});
優先度付き修正:
- 最小限: 関連データの include を追加して N+1 を回避
- より良い: select で必要なフィールドのみを取得
- 完全: 複雑な集約にはrawクエリを使用、キャッシング実装
最適化クエリパターン:
// 悪い例: N+1 問題
const users = await prisma.user.findMany();
for (const user of users) {
const posts = await prisma.post.findMany({ where: { authorId: user.id } });
}
// 良い例: リレーション include
const users = await prisma.user.findMany({
include: { posts: true }
});
// より良い例: 必要なフィールドのみ select
const users = await prisma.user.findMany({
select: {
id: true,
email: true,
posts: {
select: { id: true, title: true }
}
}
});
// 最良: 複雑なクエリには $queryRaw を使用
const result = await prisma.$queryRaw`
SELECT u.id, u.email, COUNT(p.id) as post_count
FROM users u
LEFT JOIN posts p ON p.author_id = u.id
GROUP BY u.id
`;
リソース:
- https://www.prisma.io/docs/guides/performance-and-optimization
- https://www.prisma.io/docs/concepts/components/prisma-client/raw-database-access
コネクション管理
一般的な問題:
- コネクションプール枯渇
- 「Too many connections」エラー
- サーバーレス環境でのコネクションリーク
- 初期接続の遅さ
診断:
# 現在のコネクション確認 (PostgreSQL)
psql -c "SELECT count(*) FROM pg_stat_activity WHERE datname = 'your_db';"
優先度付き修正:
- 最小限: DATABASE_URL でコネクション制限を設定
- より良い: 適切なコネクションライフサイクル管理を実装
- 完全: トラフィック量の多いアプリケーションには PgBouncer などのコネクションプーラーを使用
コネクション構成:
// サーバーレス環境の場合 (Vercel, AWS Lambda)
import { PrismaClient } from '@prisma/client';
const globalForPrisma = global as unknown as { prisma: PrismaClient };
export const prisma =
globalForPrisma.prisma ||
new PrismaClient({
log: process.env.NODE_ENV === 'development' ? ['query'] : [],
});
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma;
// グレースフルシャットダウン
process.on('beforeExit', async () => {
await prisma.$disconnect();
});
# プール設定付きコネクション URL
DATABASE_URL="postgresql://user:pass@host:5432/db?connection_limit=5&pool_timeout=10"
リソース:
- https://www.prisma.io/docs/guides/performance-and-optimization/connection-management
- https://www.prisma.io/docs/guides/deployment/deployment-guides/deploying-to-vercel
トランザクションパターン
一般的な問題:
- 非アトミック操作による不整合データ
- 並行トランザクション内でのデッドロック
- 長時間実行トランザクションによる読み込みブロック
- ネストされたトランザクションの混乱
診断:
// トランザクション問題チェック
try {
const result = await prisma.$transaction([...]);
} catch (e) {
if (e.code === 'P2034') {
console.log('Transaction conflict detected');
}
}
トランザクションパターン:
// 順序的操作 (自動トランザクション)
const [user, profile] = await prisma.$transaction([
prisma.user.create({ data: userData }),
prisma.profile.create({ data: profileData }),
]);
// インタラクティブトランザクション (手動制御)
const result = await prisma.$transaction(async (tx) => {
const user = await tx.user.create({ data: userData });
// ビジネスロジック検証
if (user.email.endsWith('@blocked.com')) {
throw new Error('Email domain blocked');
}
const profile = await tx.profile.create({
data: { ...profileData, userId: user.id }
});
return { user, profile };
}, {
maxWait: 5000, // トランザクションスロット待機
timeout: 10000, // トランザクションタイムアウト
isolationLevel: 'Serializable', // 最も厳密な分離レベル
});
// 楽観的同時実行制御
const updateWithVersion = await prisma.post.update({
where: {
id: postId,
version: currentVersion // バージョン一致時のみ更新
},
data: {
content: newContent,
version: { increment: 1 }
}
});
リソース:
コードレビューチェックリスト
スキーマ品質
- すべてのモデルに適切な
@idと主キーがある - リレーションは明示的な
@relationでfieldsとreferencesを使用 - カスケード動作を定義 (
onDelete,onUpdate) - 頻繁にクエリされるフィールドにインデックスを追加
- 固定値セットに列挙型を使用
- テーブル命名規則に
@@mapを使用
クエリパターン
- N+1 クエリなし (必要な場合はリレーションを include)
- 必要なフィールドのみを取得するために
selectを使用 - リストクエリにペジネーションを実装
- 複雑な集約に rawクエリを使用
- データベース操作に適切なエラーハンドリング
パフォーマンス
- 環境に応じてコネクションプーリング設定
- WHERE 句フィールドのインデックス存在
- マルチカラムクエリの複合インデックス
- 開発環境でクエリログ有効化
- 遅いクエリを特定して最適化
マイグレーション安全性
- 本番デプロイ前にマイグレーションをテスト
- 後方互換性のあるスキーマ変更 (データロスなし)
- マイグレーションスクリプトの正確性を確認
- ロールバック戦略を文書化
避けるべきアンチパターン
- 暗黙的な多対多オーバーヘッド: 複雑なリレーションには常に明示的な結合テーブルを使用
- 過度な include: 必要でないリレーションは include しない
- コネクション制限の無視: 環境に応じてプールサイズを常に設定
- Raw クエリの乱用: 可能な限り Prisma クエリを使用、複雑な場合のみ raw を使用
- 本番環境での dev モードマイグレーション: 本番環境では
migrate devを使用禁止
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- davila7
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/davila7/claude-code-templates / ライセンス: MIT
関連スキル
nano-banana-2
inference.sh CLIを通じてGoogle Gemini 3.1 Flash Image Preview(Nano Banana 2)で画像を生成します。テキストから画像を生成する機能、画像編集、最大14枚の複数画像入力、Google Searchグラウンディング機能に対応しています。トリガーワード:「nano banana 2」「nanobanana 2」「gemini 3.1 flash image」「gemini 3 1 flash image preview」「google image generation」
octocode-slides
洗練されたマルチファイル形式のHTMLプレゼンテーションを生成します。6段階のフロー(概要 → リサーチ → アウトライン → デザイン → 実装 → レビュー)で構成されています。各スライドは独立したHTMLファイルとなり、iframeで読み込まれます。「スライドを作成してほしい」「プレゼンテーションを作ってほしい」「HTMLスライドを生成してほしい」「デックを構築してほしい」といった依頼や、ノート・ドキュメント・コードを洗練されたプレゼンテーションに変換する際に使用できます。
gpt-image2-ppt
OpenAIのgpt-image-2を使用して、視覚的に優れたPPTスライドを生成します。Spatial Glass、Tech Blue、Editorial Monoなど10種類のキュレーション済みスタイルに対応し、ユーザーが提供したPPTXファイルを模倣するテンプレートクローンモードも搭載しています。HTMLビューアと16:9形式のPPTXファイルを出力します。プレゼンテーション、スライド、ピッチデック、投資家向けPPT、雑誌風PPTの作成依頼などで活用してください。
nano-banana
Nano Banana PRO(Gemini 3 Pro Image)およびNano Banana(Gemini 2.5 Flash Image)を使用したAI画像生成機能です。以下の場合に活用できます:(1)テキストプロンプトからの画像生成、(2)既存画像の編集、(3)インフォグラフィックス、ロゴ、商品写真、ステッカーなどのプロフェッショナルなビジュアルアセット制作、(4)複数画像での人物キャラクターの一貫性保持、(5)正確なテキスト描画を含む画像生成、(6)AI生成ビジュアルが必要なあらゆるタスク。「画像を生成」「画像を作成」「写真を作る」「ロゴをデザイン」「インフォグラフィックスを作成」「AI画像」「nano banana」またはその他の画像生成リクエストをトリガーとして機能します。
oiloil-ui-ux-guide
モダンでクリーンなUI/UXガイダンス・レビュースキルです。新機能や既存システム(Webアプリ)に対して、実行可能なUI/UX改善提案、デザイン原則、デザインレビューチェックリストが必要な場合に活用できます。CRAP(コントラスト・反復・配置・近接)をベースに、タスクファーストなUX、情報設計、フィードバック・システムステータス、一貫性、affordances、エラー防止・復旧、認知負荷を重視します。モダンミニマルスタイル(クリーン・余白・タイポグラフィ主導)を強制し、不要なテキストを削減、アイコンとしての絵文字を禁止し、統一されたアイコンセットから直感的で洗練されたアイコンを推奨します。
axiom-hig-ref
Apple Human Interface Guidelines リファレンス — 色(セマンティックカラー、カスタムカラー、パターン)、背景(マテリアル階層、ダイナミック背景)、タイポグラフィ(標準スタイル、カスタムフォント、Dynamic Type)、SF Symbols(レンダリングモード、色、多言語対応)、ダークモード、アクセシビリティ、プラットフォーム固有の考慮事項を網羅したガイドラインです。