D1 Drizzle | Skills Pool
D1 Drizzle Work with Cloudflare D1 database using Drizzle ORM in the hiu-api project. Use when writing queries, modifying schema, creating migrations, or adding new tables. Schema is in src/db/schema.ts using SQLite dialect.
D1 + Drizzle ORM Skill
Project Context
Schema file : d:/Code/hiu/api/src/db/schema.ts
DB init : d:/Code/hiu/api/src/db/index.ts
Migrations output : d:/Code/hiu/api/drizzle/migrations/
Dialect : SQLite (via Cloudflare D1)
D1 ID : 4561a6c0-cab2-49f0-8ec2-cbf5410a6baa
Tables (current schema)
Table Description usersAuth accounts albumsMusic or photo albums tracksAudio files (R2 key stored) album_tracks
npx skillvault add ngvhieu/ngvhieu-amoiapi-claude-skills-d1-drizzle-skill-md
스타 0
업데이트 2026. 2. 27.
직업 Junction: albums ↔ tracks
photosPhoto files (R2 key stored)
playlist_tracksJunction: playlists ↔ tracks
likesPolymorphic likes (track/photo/album)
commentsPolymorphic comments (track/photo)
refresh_tokensJWT refresh tokens
Initialize DB in a route import { createDb } from "../db";
const db = createDb(c.env.DB);
Common Query Patterns const item = await db.query.users.findFirst({
where: eq(users.id, id),
columns: { passwordHash: false }, // exclude sensitive fields
});
Find many with pagination:
const results = await db.query.tracks.findMany({
where: and(eq(tracks.userId, userId), eq(tracks.isPublic, true)),
orderBy: desc(tracks.createdAt),
limit, offset,
});
await db.insert(users).values({ id: nanoid(), username, email, passwordHash });
await db.update(tracks)
.set({ plays: sql`${tracks.plays} + 1` })
.where(eq(tracks.id, id));
await db.delete(likes).where(
and(eq(likes.userId, userId), eq(likes.targetId, id))
);
const [{ count }] = await db
.select({ count: sql<number>`count(*)` })
.from(tracks)
.where(eq(tracks.userId, userId));
Adding a New Table
Add table definition to src/db/schema.ts
Run npx drizzle-kit generate → creates SQL migration
Run npm run db:migrate for local, npm run db:migrate:prod for prod
Migration Commands cd d:/Code/hiu/api
npx drizzle-kit generate # generate from schema diff
npm run db:migrate # apply local
npm run db:migrate:prod # apply production
npx drizzle-kit studio # visual DB browser
Schema Conventions
IDs: text("id").primaryKey() using nanoid()
Timestamps: text("created_at").default(sql\(datetime('now'))`)`
Booleans: integer("is_public", { mode: "boolean" }).default(true)
Foreign keys: always add .references(() => table.id, { onDelete: "cascade" })
Add indexes for all FK columns and frequently filtered columns
Project Context