drizzle-orm
Drizzle ORM patterns for Neon PostgreSQL. Use when creating tables, schemas, migrations, or database queries.
Installation
Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.
View source ↗GuidesSkill instructions
Drizzle ORM (Neon PostgreSQL)
Creating a new table
- Create file in
lib/db/schemas/{domain}.ts - Define enum if needed
- Define table with columns and indexes
- Export types
- Re-export from
lib/db/schema.ts
import { pgTable, pgEnum, index, integer, varchar, timestamp } from "drizzle-orm/pg-core"
import type { InferSelectModel, InferInsertModel } from "drizzle-orm"
// 1. Enum (if needed)
export const statusEnum = pgEnum("status", ["active", "inactive"])
// 2. Table with indexes as third argument
export const items = pgTable("items", {
id: integer("id").primaryKey().generatedAlwaysAsIdentity(),
name: varchar("name", { length: 255 }).notNull(),
status: statusEnum("status").notNull(),
created_at: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
updated_at: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
}, (table) => [
index("idx_items_name").on(table.name),
])
// 3. Types
export type Item = InferSelectModel<typeof items>
export type InsertItem = InferInsertModel<typeof items>
See examples/schema-pattern.ts for full pattern.
Adding a foreign key
author_id: integer("author_id")
.notNull()
.references(() => users.id, { onDelete: "cascade" })
Always specify onDelete behavior explicitly.
Standard columns
// Primary key
id: integer("id").primaryKey().generatedAlwaysAsIdentity()
// Timestamps (always with timezone)
created_at: timestamp("created_at", { withTimezone: true }).notNull().defaultNow()
updated_at: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow()
Naming conventions
- Index:
idx_{table}_{column}→idx_items_name - One domain per schema file →
songs.ts,dictionary.ts
Avoid
-
serial()→ useinteger().generatedAlwaysAsIdentity() - Timestamps without
{ withTimezone: true } - Foreign keys without explicit
onDelete
Examples
Read the usage examples in the source repository.
View source ↗Source history
- Indexed on
- 2026-01-20
- Index updated
- 2026-03-03
- Branch
- main
Index and sync dates describe this directory. View the source repository for code history.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!