数据库
Next.js 模板的 Drizzle ORM 与 PostgreSQL 配置。
模板使用 PostgreSQL 与 Drizzle ORM,通过 node-postgres 连接池访问。认证与 支付的 schema 以代码定义,并用 Drizzle Kit 推送到数据库。
提供的能力
- 带连接池的 PostgreSQL 客户端(
src/lib/db/index.ts)。 - 用于认证与支付的类型化 Drizzle schema。
- 本地 schema 推送工作流与 Drizzle Studio。
重要文件
| 文件 | 作用 |
|---|---|
src/lib/db/index.ts | pg Pool + Drizzle 客户端(db) |
src/lib/db/schema/auth.ts | user、session、account、verification |
src/lib/db/schema/payment.ts | subscription、payment 及枚举 |
drizzle.config.ts | Drizzle Kit 配置(schema 目录、方言、凭据) |
客户端
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.id,onDelete: "cascade"。account—— OAuth/凭据账户,同样随用户级联删除。verification—— 邮箱验证与重置令牌。
支付(schema/payment.ts):
subscription—— 每个用户一行(userId为unique),含provider、status与周期字段。在userId与status上建索引。payment—— 每个订单一行(orderNo为unique),在userId与orderNo上建索引。- 枚举:
provider(zpay、creem、stripe、polar)、plan_interval(one_time、month、year)、subscription_status与order_status。
两个支付表都引用 user.id 并级联删除。
配置步骤
设置 DATABASE_URL
在 .env 中指向本地或托管的 PostgreSQL 实例。
查看数据(可选)
pnpm exec drizzle-kit studio新增表或字段
- 在
src/lib/db/schema/*(或新文件)中新增或编辑表。 - 若是新文件,确保它已被导出进
src/lib/db/index.ts中db的 schema。 - 运行
pnpm exec drizzle-kit push。
保持 Better Auth 的 schema 同步。 user、session、account 与
verification 表对应 Better Auth 适配器。若你新增了期望额外列的认证功能或插件,
需相应更新 schema/auth.ts 并再次推送 —— 否则认证查询会失败。
本地 push vs. 生产迁移
drizzle-kit push 是本地/开发工作流:它将 schema 与数据库做差异比对并直接应用,
这可能具有破坏性。本仓库不包含已提交的 drizzle/ 迁移文件,因此没有可供部署的、
经审阅的迁移历史。请勿将 migrate 步骤视为就绪 —— 生产环境需要生成并提交迁移
(drizzle-kit generate)并通过部署步骤运行后才能依赖它们。在此之前,请将 schema
变更视为手动操作,并先做备份。
生产注意事项
- 使用带连接池的托管 PostgreSQL。
pgPool按实例维持连接;在 serverless 环境中 优先使用池化连接串(例如 pgBouncer/事务池端点),以避免连接耗尽。 - 保持
DATABASE_URL仅服务端可见;切勿暴露给浏览器。 - 上线前建立备份与迁移流程。
