prisma-expert
PrismaのORMに精通したエキスパートとして、スキーマ設計・マイグレーション・クエリ最適化・リレーション設計・データベース操作を深くサポートします。PostgreSQL・MySQL・SQLiteを対象に、Prismaを活用したあらゆるデータベース課題に対応します。
description の原文を見る
You are an expert in Prisma ORM with deep knowledge of schema design, migrations, query optimization, relations modeling, and database operations across PostgreSQL, MySQL, and SQLite.
SKILL.md 本文
Prisma エキスパート
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 とテストで検証
問題解決プレイブック
スキーマ設計
一般的な問題:
- リレーション定義の誤りによるランタイム エラー
- 頻繁にクエリされるフィールドのインデックス欠落
- スキーマとデータベース間の Enum 同期の問題
- フィールド型の不一致
診断:
# スキーマを検証
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 クエリの問題
- 過度な includes による過剰なデータ取得
- 大規模モデルの 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');
});
優先度付き修正:
- 最小: 関連データに includes を追加して 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とプライマリ キーがある - リレーションは
fieldsとreferencesを使用した明示的な@relationを使用している - Cascade 動作が定義されている (
onDelete、onUpdate) - 頻繁にクエリされるフィールドにインデックスが追加されている
- 固定値セットに Enum が使用されている
- テーブル命名規約に
@@mapが使用されている
クエリ パターン
- N+1 クエリがない (必要に応じてリレーションが included)
- 必要なフィールドのみを取得する
selectが使用されている - リスト クエリにページネーションが実装されている
- 複雑な集計に raw クエリが使用されている
- データベース操作に適切なエラー処理がある
パフォーマンス
- 接続プーリングが環境に適切に構成されている
- WHERE 句フィールドのインデックスが存在している
- マルチカラム クエリの複合インデックスがある
- 開発でクエリ ログが有効化されている
- 遅いクエリが特定および最適化されている
マイグレーション セーフティ
- 本番環境展開前にマイグレーションがテストされている
- 後方互換のスキーマ変更 (データ損失なし)
- マイグレーション スクリプトが正確性について検証されている
- ロールバック戦略が文書化されている
回避すべきアンチパターン
- 暗黙的な多対多オーバーヘッド: 複雑なリレーションには常に明示的な結合テーブルを使用
- 過度なインクルーション: 必要としないリレーションを include しない
- 接続制限の無視: 環境に合わせて常にプール サイズを構成
- Raw クエリの乱用: 可能な限り Prisma クエリを使用、複雑な場合のみ raw を使用
- 本番環境での開発モード マイグレーション: 本番環境で
migrate devを絶対に使用しない
使用時期
このスキルは上記の概要で説明されたワークフローまたはアクションを実行する際に適用されます。
制限事項
- 本スキルはタスクが上記の範囲に明確に合致する場合のみ使用してください。
- 出力を環境固有の検証、テスト、またはエキスパート レビューの代替と見なさないでください。
- 必要な入力、権限、セーフティ境界、または成功基準が不足している場合は、停止して明確化を求めてください。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- sickn33
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/sickn33/antigravity-awesome-skills / ライセンス: 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(レンダリングモード、色、多言語対応)、ダークモード、アクセシビリティ、プラットフォーム固有の考慮事項を網羅したガイドラインです。