数据库

Drizzle ORM、数据模型和数据库管理

概览

项目使用 Drizzle ORM 连接 PostgreSQL 数据库。

ORM(对象关系映射,就是一个帮你自动写 SQL 的工具):你不用手写 SQL 语句,直接在代码里调用 db.user.findMany() 这样的方法就能操作数据库。

  • Schema 文件: apps/01mvp-web/src/db/schema
  • Drizzle 配置: apps/01mvp-web/drizzle.config.ts
  • Migration 目录: apps/01mvp-web/drizzle

常用命令

pnpm db:generate      # 根据 Drizzle schema 生成 migration 文件
pnpm db:migrate       # 执行已生成的 migration
pnpm db:deploy        # 在生产或预发环境执行已提交的迁移
pnpm db:status        # 检查 schema 与 migration 是否一致
pnpm db:push:unsafe   # 直接同步 schema,可能接受数据丢失,仅用于可丢弃数据库
pnpm db:studio        # 打开 Drizzle Studio,直接浏览和编辑数据

generate、migrate、push 的区别

db:generate 会读取 src/db/schema 下的 Drizzle schema,并在 drizzle/ 下生成新的 migration 文件。它不会直接修改数据库数据。

db:migrate 会把已经生成的 migration 执行到当前数据库。迁移文件会提交到 Git,之后部署、回滚、排查问题都有记录。日常开发和准备上线的改动都优先使用 migration。

db:deploy 只执行已经提交的迁移文件,不会创建新迁移。生产、预发、CI/CD 用它,不要在这些环境跑 db:migrate

db:push:unsafe 会绕过迁移文件,直接把当前 schema 同步到数据库。只在本地临时库、测试库、可以随时重建的数据环境里用。

场景命令说明
新增表、字段、索引等正常开发pnpm db:generate生成 migration 文件
应用本地迁移pnpm db:migrate执行已生成的 migration
准备上线或多人协作pnpm db:generate + pnpm db:migrate本地生成并验证 migration,提交到 Git
生产或预发执行迁移pnpm db:deploy只应用已提交的迁移文件
临时实验,数据库可以丢pnpm db:push:unsafe不生成迁移记录,可能造成数据丢失

不确定用哪个? 就用 pnpm db:migrate。只有确认当前数据库可以重建时,才用 pnpm db:push:unsafe

推荐迁移流程

修改 Schema:编辑 apps/01mvp-web/src/db/schema 下的表定义,添加或修改模型字段

创建迁移:运行 pnpm db:generate,生成新的 migration 文件

应用迁移:运行 pnpm db:migrate,把 migration 执行到本地数据库

本地验证:确认功能正常、pnpm build 通过

提交代码:把 src/db/schema/** 和新生成的 drizzle/** 一起提交到 Git

部署迁移:生产和预发环境运行 pnpm db:deploy,只执行已提交的迁移文件

如果迁移写错了,不要直接改已经提交或已经部署过的历史迁移。开发阶段还没共享出去时可以重建迁移;已经共享或上线后,新增一条迁移来修正。

核心数据模型

Schema 中已定义的主要模型:

  • User — 用户(邮箱、密码、OAuth、微信绑定、个人资料)
  • Account / Session / Verification — Better Auth 认证相关表
  • Passkey / TwoFactor — 通行密钥和双因素认证
  • Purchase — 支付订单和订阅记录
  • ChatSession / ChatMessage — AI 对话会话和消息
  • CreditTransaction — 用户余额变动记录

在代码中使用数据库

// apps/01mvp-web/src/lib/database.ts
import { db } from "@/lib/database";

// 查询示例
const users = await db.user.findMany({
  where: { emailVerified: true },
  include: { accounts: true },
});

推荐的免费 PostgreSQL 云服务:Neon(支持分支和自动暂停)。