00 / 00

数据库

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

概览

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

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

  • Schema 文件: products/01mvp/packages/db/src/schema
  • Drizzle 配置: products/01mvp/packages/db/drizzle.config.ts
  • Migration 目录: products/01mvp/packages/db/migrations

常用命令

本页命令默认在 products/01mvp 目录下运行。你也可以在仓库根目录用短写,例如 vpr @01mvp/product#db:migrate

vpr db:generate      # 根据 Drizzle schema 生成 migration 文件
vpr db:migrate       # 执行已生成的 migration
vpr db:seed          # 创建或更新本地测试管理员
vpr db:push          # 直接同步 schema,仅用于本地或可丢弃数据库
vpr db:studio        # 打开 Drizzle Studio,直接浏览和编辑数据
vpr db:dev:start     # 启动本地开发 PostgreSQL
vpr db:dev:stop      # 停止本地开发 PostgreSQL

generate、migrate、push 的区别

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

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

生产环境使用显式迁移。上线前要先在本地用 vpr db:generate + vpr db:migrate 验证迁移,部署前再用生产环境变量运行 vpr db:deploy

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

场景命令说明
新增表、字段、索引等正常开发vpr db:generate生成 migration 文件
应用本地迁移vpr db:migrate执行已生成的 migration
本地登录态验收vpr db:seed创建或更新本地测试管理员
准备上线或多人协作vpr db:generate + vpr db:migrate本地生成并验证 migration,提交到 Git
生产执行迁移vpr db:deploy部署生产代码前执行已提交的迁移文件
临时实验,数据库可以丢vpr db:push不生成迁移记录,可能造成数据丢失

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

Seed 测试账号

db:seed 用来准备本地开发和自动化验收需要的管理员账号:

vpr db:seed

默认账号是 [email protected] / Admin123456,角色是 super_admin。脚本会重复执行安全地更新同一个邮箱账号:如果用户不存在就创建;如果用户已经存在,就把它恢复为未封禁、邮箱已验证的超级管理员,并重置邮箱密码凭据。

db:seed 名称保留给数据库数据准备。浏览器测试里的 Playwright auth-setup 项目会调用它,然后再登录一次并保存 storageState;这两层不要合并成一个 setup 命令。

需要自定义账号时:

vpr db:seed -- --email [email protected] --password Admin123456

db:seed 默认拒绝非本地数据库。只有确认目标是可丢弃的远程开发库时,才使用 vpr db:seed -- --allow-remote

推荐迁移流程

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

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

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

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

提交代码:把 products/01mvp/packages/db/src/schema/** 和新生成的 products/01mvp/packages/db/migrations/** 一起提交到 Git

部署迁移:部署生产代码前运行 vpr db:deploy

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

核心数据模型

Schema 中已定义的主要模型:

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

在代码中使用数据库

import { getPostgresDb } from "@01mvp/db";

const db = getPostgresDb();

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

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

这篇文档有问题?