功能指南

数据库

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(支持分支和自动暂停)。