数据库
Prisma ORM、数据模型和数据库管理
概览
项目使用 Prisma(Node.js 最流行的 ORM 之一)连接 PostgreSQL 数据库。
ORM(对象关系映射,就是一个帮你自动写 SQL 的工具):你不用手写 SQL 语句,直接在代码里调用 db.user.findMany() 这样的方法就能操作数据库。
- Schema 文件:
apps/01mvp-web/prisma/schema.prisma - Prisma Client 生成位置:
apps/01mvp-web/src/generated/prisma
常用命令
pnpm db:generate # 只重新生成 Prisma Client 和类型,不修改数据库
pnpm db:migrate # 创建并执行迁移文件,推荐日常开发使用
pnpm db:deploy # 在生产或预发环境执行已提交的迁移
pnpm db:status # 查看当前数据库的迁移状态
pnpm db:push:unsafe # 直接同步 schema,可能接受数据丢失,仅用于可丢弃数据库
pnpm db:studio # 打开可视化管理界面,直接浏览和编辑数据generate、migrate、push 的区别
db:generate 只更新代码里使用的 Prisma Client 和类型。比如你改了 schema.prisma,TypeScript 还不知道新字段,就需要跑它。它不会创建表,也不会改数据库数据。
db:migrate 会根据 schema.prisma 创建迁移文件,并把迁移执行到数据库里。迁移文件会提交到 Git,之后部署、回滚、排查问题都有记录。日常开发和准备上线的改动都优先用它。
db:deploy 只执行已经提交的迁移文件,不会创建新迁移。生产、预发、CI/CD 用它,不要在这些环境跑 db:migrate。
db:push:unsafe 会绕过迁移文件,直接把当前 schema 同步到数据库。这个命令包含 --accept-data-loss,也就是 Prisma 认为需要删列、删表或改类型时会直接接受数据丢失。只在本地临时库、测试库、可以随时重建的数据环境里用。
| 场景 | 命令 | 说明 |
|---|---|---|
| 只改了 schema,代码类型报错 | pnpm db:generate | 重新生成 Prisma Client,不碰数据库 |
| 新增表、字段、索引等正常开发 | pnpm db:migrate | 生成迁移文件并执行,推荐默认用这个 |
| 准备上线或多人协作 | pnpm db:migrate | 本地创建迁移文件,提交到 Git |
| 生产或预发执行迁移 | pnpm db:deploy | 只应用已提交的迁移文件 |
| 临时实验,数据库可以丢 | pnpm db:push:unsafe | 不生成迁移记录,可能造成数据丢失 |
不确定用哪个? 就用 pnpm db:migrate。只有确认当前数据库可以重建时,才用 pnpm db:push:unsafe。
推荐迁移流程
修改 Schema:编辑 apps/01mvp-web/prisma/schema.prisma,添加或修改模型字段
创建迁移:运行 pnpm db:migrate,按提示输入迁移名称(如 add-user-phone)
生成类型:运行 pnpm db:generate,确保代码中的 TypeScript 类型与数据库同步
本地验证:确认功能正常、pnpm build 通过
提交代码:把 schema.prisma 和新生成的 prisma/migrations/** 一起提交到 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(支持分支和自动暂停)。