Expert guide for Drizzle ORM best practices, including schema definitions, queries, mutations, transactions, migrations, and performance optimization. Use when working with Drizzle ORM, database schemas, queries, or migrations.
This skill provides guidelines, patterns, and best practices for working with Drizzle ORM in this project.
For detailed development guidelines, patterns, and code examples, refer to references/patterns.md.
Organize schemas by domain in separate files. Use fluent constraint chaining and add indexes for frequently queried columns.
export const users = pgTable('users', {
id: uuid('id').primaryKey().defaultRandom(),
email: varchar('email', { length: 255 }).notNull().unique(),
createdAt: timestamp('created_at').defaultNow().notNull(),
});
Always export table types for use in your application:
export type User = typeof users.$inferSelect;
export type NewUser = typeof users.$inferInsert;
Use prepared statements for frequently executed queries for extreme performance benefits:
export const getUserById = db
.select()
.from(users)
.where(eq(users.id, sql.placeholder('id')))
.prepare();
// Usage
const user = await getUserById.execute({ id: userId });
Use transactions for multi-step operations to maintain data consistency:
return db.transaction(async (tx) => {
const [user] = await tx.insert(users).values(userData).returning();
const [profile] = await tx.insert(profiles).values({ userId: user.id, ...profileData }).returning();
return { user, profile };
});
CRITICAL: Always use package scripts for migrations. Never call drizzle-kit directly.
pnpm run db:generate (generates migration)pnpm run db:migrate (applies migrations)pnpm run db:generate (generates migration)pnpm run db:migrate (applies migrations)db/
index.ts (Drizzle client initialization)
schema/
users.ts (User table & relations)
posts.ts (Post table & relations)
queries/
users.ts (User query functions)
posts.ts (Post query functions)
migrations/ (Auto-generated migration files)
limit() and offset() for user-facing queriessql.placeholder()with() or batch queriesBefore finishing a task involving Drizzle ORM:
pnpm run typecheck) and tests (pnpm run test)For detailed rules and code examples, consult references/patterns.md.