AI Skill Library

Drizzle ORM

TypeScript-first SQL ORM: schema, migrations, queries, relations, serverless.

drizzledatabaseormtypescript
# Drizzle ORM

## Install
```bash
npm install drizzle-orm postgres
npm install -D drizzle-kit
```

## Schema definition
```ts
import { pgTable, serial, text, integer, boolean, timestamp } from 'drizzle-orm/pg-core'
import { relations } from 'drizzle-orm'

export const users = pgTable('users', {
  id: serial('id').primaryKey(),
  name: text('name').notNull(),
  email: text('email').notNull().unique(),
  createdAt: timestamp('created_at').defaultNow(),
})

export const posts = pgTable('posts', {
  id: serial('id').primaryKey(),
  title: text('title').notNull(),
  published: boolean('published').default(false),
  authorId: integer('author_id').references(() => users.id, { onDelete: 'cascade' }),
})

export const usersRelations = relations(users, ({ many }) => ({
  posts: many(posts),
}))
export const postsRelations = relations(posts, ({ one }) => ({
  author: one(users, { fields: [posts.authorId], references: [users.id] }),
}))
```

## drizzle.config.ts
```ts
import { defineConfig } from 'drizzle-kit'
export default defineConfig({
  schema: './src/db/schema.ts',
  out: './drizzle',
  dialect: 'postgresql',
  dbCredentials: { url: process.env.DATABASE_URL! },
})
```
```bash
npx drizzle-kit generate  # generate migration
npx drizzle-kit migrate   # apply
npx drizzle-kit studio    # GUI
```

## Queries
```ts
import { db } from './db'
import { users, posts } from './schema'
import { eq, and, like, desc, count } from 'drizzle-orm'

// Select
const all = await db.select().from(users)
const user = await db.select().from(users).where(eq(users.id, 1))

// With relations
const withPosts = await db.query.users.findMany({
  with: { posts: { where: eq(posts.published, true) } },
  orderBy: desc(users.createdAt),
  limit: 10,
})

// Insert
const [newUser] = await db.insert(users).values({ name: 'A', email: 'a@b.c' }).returning()

// Update
await db.update(users).set({ name: 'B' }).where(eq(users.id, 1))

// Delete
await db.delete(users).where(eq(users.id, 1))
```

## Transactions
```ts
await db.transaction(async (tx) => {
  const [user] = await tx.insert(users).values({ ... }).returning()
  await tx.insert(posts).values({ authorId: user.id, ... })
})
```

## Serverless / Edge (Neon, Turso)
```ts
import { neon } from '@neondatabase/serverless'
import { drizzle } from 'drizzle-orm/neon-http'
const sql = neon(process.env.DATABASE_URL!)
export const db = drizzle(sql, { schema })
```

API: /api/skills/drizzle-orm