name: drizzle-patterns
description: Drizzle ORM 的 PostgreSQL 模式。
Drizzle ORM 模式
模式定义
// db/schema/users.ts
import { pgTable, uuid, varchar, timestamp, boolean } from 'drizzle-orm/pg-core';
export const users = pgTable('users', {
id: uuid('id').primaryKey().defaultRandom(),
email: varchar('email', { length: 255 }).notNull().unique(),
name: varchar('name', { length: 255 }),
emailVerified: boolean('email_verified').default(false),
createdAt: timestamp('created_at').defaultNow().notNull(),
updatedAt: timestamp('updated_at').defaultNow().notNull(),
});
export type User = typeof users.$inferSelect;
export type NewUser = typeof users.$inferInsert;
关系定义
// db/schema/relations.ts
import { relations } from 'drizzle-orm';
import { users } from './users';
import { posts } from './posts';
export const usersRelations = relations(users, ({ many }) => ({
posts: many(posts),
}));
export const postsRelations = relations(posts, ({ one }) => ({
author: one(users, {
fields: [posts.authorId],
references: [users.id],
}),
}));
数据库客户端
// db/index.ts
import { drizzle } from 'drizzle-orm/node-postgres';
import { Pool } from 'pg';
import * as schema from './schema';
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
});
export const db = drizzle(pool, { schema });
查询操作
import { eq, and, or, like, desc, asc } from 'drizzle-orm';
// 查找单个
const user = await db.query.users.findFirst({
where: eq(users.id, userId),
});
// 查找多个并包含关联数据
const usersWithPosts = await db.query.users.findMany({
with: { posts: true },
where: eq(users.emailVerified, true),
orderBy: [desc(users.createdAt)],
limit: 10,
});
// 复杂条件查询
const results = await db.query.posts.findMany({
where: and(
eq(posts.published, true),
or(
like(posts.title, '%search%'),
like(posts.content, '%search%')
)
),
});
数据变更操作
// 插入
const [newUser] = await db.insert(users).values({
email: 'test@example.com',
name: 'Test User',
}).returning();
// 批量插入
await db.insert(users).values([
{ email: 'user1@example.com', name: 'User 1' },
{ email: 'user2@example.com', name: 'User 2' },
]);
// 更新
await db.update(users)
.set({ name: 'New Name', updatedAt: new Date() })
.where(eq(users.id, userId));
// 删除
await db.delete(users)
.where(eq(users.id, userId));
事务处理
await db.transaction(async (tx) => {
const [user] = await tx.insert(users).values(userData).returning();
await tx.insert(profiles).values({ userId: user.id, ...profileData });
await tx.insert(settings).values({ userId: user.id, ...defaultSettings });
});
数据库迁移
# 生成迁移文件
pnpm drizzle-kit generate
# 推送到数据库
pnpm drizzle-kit push
# 打开 Drizzle Studio
pnpm drizzle-kit studio
drizzle.config.ts
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
schema: './db/schema/index.ts',
out: './db/migrations',
dialect: 'postgresql',
dbCredentials: {
url: process.env.DATABASE_URL!,
},
});