mcpField
D
drizzle-postgres

drizzle-postgres

github.com/pedronauckデータ・データベース644248 回インストール1 週間前に更新
リポジトリ

drizzle-postgres について

Drizzle ORM で型安全な PostgreSQL アプリケーションを構築するための実用ガイドです。開発者向けに、スキーマ設計、クエリ、マイグレーション、性能問題の調査方法をまとめています。

主な機能

  1. 01スキーマとリレーションのパターン
  2. 02型付きクエリの例
  3. 03マイグレーションコマンドの案内
  4. 04クエリ性能の確認項目
  5. 05PostgreSQL の参考トピック

活用シーン

  1. 01一対多・多対多のデータ設計
  2. 02リレーショナルクエリによる N+1 回避
  3. 03スキーマ変更の生成と適用
  4. 04遅いクエリの調査とインデックス最適化

インストール

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

$npx skills add https://github.com/pedronauck/skills --skill drizzle-postgres

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

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
CHEATSHEET.md
MIGRATIONS.md
PERFORMANCE.md
POSTGRES.md
QUERIES.md
RELATIONS.md
SCHEMA.md

詳細

PostgreSQL + Drizzle ORM

PostgreSQL 18 と Drizzle ORM を使用した、型安全なデータベースアプリケーションです。

基本コマンド

npx drizzle-kit generate   # Generate migration from schema changes
npx drizzle-kit migrate    # Apply pending migrations
npx drizzle-kit push       # Push schema directly (dev only!)
npx drizzle-kit studio     # Open database browser

クイック判断ツリー

「このリレーションはどのようにモデル化すればよいですか?」
Relationship type?
├─ One-to-many (user has posts)     → FK on "many" side + relations()
├─ Many-to-many (posts have tags)   → Junction table + relations()
├─ One-to-one (user has profile)    → FK with unique constraint
└─ Self-referential (comments)      → FK to same table
「クエリが遅いのはなぜですか?」
Slow query?
├─ Missing index on WHERE/JOIN columns  → Add index
├─ N+1 queries in loop                  → Use relational queries API
├─ Full table scan                      → EXPLAIN ANALYZE, add index
├─ Large result set                     → Add pagination (limit/offset)
└─ Connection overhead                  → Enable connection pooling
「どの drizzle-kit コマンドを使えばよいですか?」
What do I need?
├─ Schema changed, need SQL migration   → drizzle-kit generate
├─ Apply migrations to database         → drizzle-kit migrate
├─ Quick dev iteration (no migration)   → drizzle-kit push
└─ Browse/edit data visually            → drizzle-kit studio

ディレクトリ構成

src/db/
├── schema/
│   ├── index.ts          # Re-export all tables
│   ├── users.ts          # Table + relations
│   └── posts.ts          # Table + relations
├── db.ts                 # Connection with pooling
└── migrate.ts            # Migration runner
drizzle/
└── migrations/           # Generated SQL files
drizzle.config.ts         # drizzle-kit config

スキーマパターン

タイムスタンプ付きの基本テーブル
export const users = pgTable("users", {
  id: uuid("id").primaryKey().defaultRandom(),
  email: varchar("email", { length: 255 }).notNull().unique(),
  createdAt: timestamp("created_at").defaultNow().notNull(),
  updatedAt: timestamp("updated_at").defaultNow().notNull(),
});
インデックス付き外部キー
export const posts = pgTable(
  "posts",
  {
    id: uuid("id").primaryKey().defaultRandom(),
    userId: uuid("user_id")
      .notNull()
      .references(() => users.id),
    title: varchar("title", { length: 255 }).notNull(),
  },
  (table) => [
    index("posts_user_id_idx").on(table.userId), // ALWAYS index FKs
  ],
);
リレーション
export const usersRelations = relations(users, ({ many }) => ({
  posts: many(posts),
}));

export const postsRelations = relations(posts, ({ one }) => ({
  author: one(users, { fields: [posts.userId], references: [users.id] }),
}));

クエリパターン

リレーショナルクエリ(N+1 を回避)
// ✓ Single query with nested data
const usersWithPosts = await db.query.users.findMany({
  with: { posts: true },
});
フィルタリングされたクエリ
const activeUsers = await db
  .select()
  .from(users)
  .where(eq(users.status, "active"));
トランザクション
await db.transaction(async (tx) => {
  const [user] = await tx.insert(users).values({ email }).returning();
  await tx.insert(profiles).values({ userId: user.id });
});

パフォーマンスチェックリスト

優先度チェック項目影響
CRITICALすべての外部キーにインデックスを設定するJOIN 時のフルテーブルスキャンを防止します
CRITICALネストされたデータにはリレーショナルクエリを使うN+1 を回避します
HIGH本番環境でコネクションプーリングを使うコネクションのオーバーヘッドを削減します
HIGH遅いクエリに EXPLAIN ANALYZE を使う不足しているインデックスを特定します
MEDIUMフィルタリングされたサブセットに部分インデックスを使うより小さく、高速なインデックスになります
MEDIUMPK に UUIDv7 を使う(PG18+)インデックスの局所性が向上します

アンチパターン(CRITICAL)

アンチパターン問題対処
外部キーのインデックスがないJOIN が遅く、フルスキャンが発生しますすべての外部キー列にインデックスを追加します
ループ内の N+1行ごとにクエリが実行されますwith: リレーショナルクエリを使います
プーリングがないリクエストごとにコネクションを作成します@neondatabase/serverless などを使います
本番環境での pushデータ損失のリスクがあります必ず generate + migrate を使います
JSON をテキストとして保存検証できず、クエリの質も低下しますjsonb() 列型を使います

リファレンスドキュメント

ファイル用途
references/SCHEMA.md列の型、制約
references/QUERIES.md演算子、結合、集約
references/RELATIONS.md1対多、多対多
references/MIGRATIONS.mddrizzle-kit のワークフロー
references/POSTGRES.mdPG18 の機能、RLS、パーティショニング
references/PERFORMANCE.mdインデックス作成、最適化
references/CHEATSHEET.mdクイックリファレンス

リソース

Drizzle ORM
PostgreSQL

コメント