数据库

Next.js 模板的 Drizzle ORM 与 PostgreSQL 配置。

模板使用 PostgreSQLDrizzle ORM,通过 node-postgres 连接池访问。认证与 支付的 schema 以代码定义,并用 Drizzle Kit 推送到数据库。

提供的能力

  • 带连接池的 PostgreSQL 客户端(src/lib/db/index.ts)。
  • 用于认证与支付的类型化 Drizzle schema。
  • 本地 schema 推送工作流与 Drizzle Studio。

重要文件

文件作用
src/lib/db/index.tspg Pool + Drizzle 客户端(db
src/lib/db/schema/auth.tsusersessionaccountverification
src/lib/db/schema/payment.tssubscriptionpayment 及枚举
drizzle.config.tsDrizzle Kit 配置(schema 目录、方言、凭据)

客户端

src/lib/db/index.ts
import { drizzle } from "drizzle-orm/node-postgres";
import { Pool } from "pg";

const pool = new Pool({ connectionString: process.env.DATABASE_URL });

export const db = drizzle(pool, { schema: { ...authSchema, ...paymentSchema } });

任意位置通过 import { db } from "@/lib/db" 引入。

Schema 概览

认证schema/auth.ts)—— 与 Better Auth 适配器的预期一致:

  • user —— 包含 role(默认 "user")、emailVerified,以及 admin 插件的 banned / banReason / banExpires 字段。
  • session —— userId 引用 user.idonDelete: "cascade"
  • account —— OAuth/凭据账户,同样随用户级联删除。
  • verification —— 邮箱验证与重置令牌。

支付schema/payment.ts):

  • subscription —— 每个用户一行(userIdunique),含 providerstatus 与周期字段。在 userIdstatus 上建索引。
  • payment —— 每个订单一行(orderNounique),在 userIdorderNo 上建索引。
  • 枚举:providerzpaycreemstripepolar)、plan_intervalone_timemonthyear)、subscription_statusorder_status

两个支付表都引用 user.id 并级联删除。

配置步骤

设置 DATABASE_URL

.env 中指向本地或托管的 PostgreSQL 实例。

推送 schema

pnpm exec drizzle-kit push

这会将 src/lib/db/schema 中的 schema 直接应用到数据库。

查看数据(可选)

pnpm exec drizzle-kit studio

新增表或字段

  1. src/lib/db/schema/*(或新文件)中新增或编辑表。
  2. 若是新文件,确保它已被导出进 src/lib/db/index.tsdb 的 schema。
  3. 运行 pnpm exec drizzle-kit push

保持 Better Auth 的 schema 同步。 usersessionaccountverification 表对应 Better Auth 适配器。若你新增了期望额外列的认证功能或插件, 需相应更新 schema/auth.ts 并再次推送 —— 否则认证查询会失败。

本地 push vs. 生产迁移

drizzle-kit push本地/开发工作流:它将 schema 与数据库做差异比对并直接应用, 这可能具有破坏性。本仓库不包含已提交的 drizzle/ 迁移文件,因此没有可供部署的、 经审阅的迁移历史。请勿将 migrate 步骤视为就绪 —— 生产环境需要生成并提交迁移 (drizzle-kit generate)并通过部署步骤运行后才能依赖它们。在此之前,请将 schema 变更视为手动操作,并先做备份。

生产注意事项

  • 使用带连接池的托管 PostgreSQL。pg Pool 按实例维持连接;在 serverless 环境中 优先使用池化连接串(例如 pgBouncer/事务池端点),以避免连接耗尽。
  • 保持 DATABASE_URL 仅服务端可见;切勿暴露给浏览器。
  • 上线前建立备份与迁移流程。

相关页面

On this page