数据库

Nuxt 模板中的 Drizzle ORM 与 PostgreSQL 配置。

数据库层已集成:通过 node-postgres 在 PostgreSQL 上使用 Drizzle ORM,包含认证与支付 schema。Postgres + Drizzle 是唯一打通的路径 —— Prisma 占位已移除。

关键文件

文件作用
server/database/drizzle/client.ts创建 Drizzle 客户端:drizzle(runtimeConfig.databaseUrl)
server/database/index.ts重新导出客户端(同时是 Drizzle Kit 的 schema 入口)
server/database/drizzle/drizzle.config.tsDrizzle Kit 配置(dialect、schema、迁移输出目录)
server/database/drizzle/schema/auth.tsusersessionaccountverification
server/database/drizzle/schema/payment.tssubscriptionpayment 表 + 枚举
server/database/drizzle/service/payment.ts小型数据访问辅助(createPayment
server/database/drizzle/types.tsdrizzle-zod 插入 schema(PaymentInsertScheme

客户端

// server/database/drizzle/client.ts
import { drizzle } from "drizzle-orm/node-postgres";
const runtimeConfig = useRuntimeConfig();
const db = drizzle(runtimeConfig.databaseUrl!);
export default db;

在服务端任意位置以 import db from "~~/server/database/drizzle/client" 导入。 Better Auth 通过 server/utils/auth.ts 中的 Drizzle 适配器(provider: "pg") 消费认证 schema —— 参见 身份认证

Schema

认证 schema 包含 Better Auth 的 usersessionaccountverification 表(user 表含 role 以及 admin 插件的 banned/banReason/banExpires 字段)。

支付 schema 包含:

  • subscription —— 每用户一行(userId 唯一),含 providerstatus、周期 日期与试用字段。
  • payment —— 每订单一行,含 amountcurrencystatusprovider 以及 唯一的 orderNo

两者均使用 Postgres 枚举(providerorder_statussubscription_statusplan_interval)。行如何写入见 支付

迁移工作流

本模板采用 generate/migrate(而非 push)工作流。Drizzle Kit 读取 server/database/drizzle/drizzle.config.ts,其 schema 指向 server/database/index.ts,将迁移写入 server/database/migrations,并从 Nuxt 运行时配置读取 NUXT_DATABASE_URL

命令作用
npx drizzle-kit generate从 schema 生成 SQL 迁移
npx drizzle-kit migrate应用待处理的迁移
npx drizzle-kit studio在 Drizzle Studio 中浏览数据

模板出厂时不含已提交的 server/database/migrations 目录 —— 首次 generate 会 根据当前 schema 创建它。请提交生成的 SQL,使各环境部署应用相同的迁移。

新增表或字段

修改 schema

server/database/drizzle/schema/*.ts 中新增或修改表。确保它能从 server/database/index.ts 到达,因为该文件是 Drizzle Kit 的 schema 入口。

生成并应用

npx drizzle-kit generate
npx drizzle-kit migrate

保持 Better Auth 同步

若改动了认证表,请保持与 Better Auth 所需列的兼容。优先通过插件/配置扩展,而非 重命名核心列。

生产注意事项

  • drizzle(databaseUrl) 使用 node-postgres 连接池。在 serverless/edge 平台上, 将 NUXT_DATABASE_URL 指向你的服务商连接池字符串,以免耗尽连接数。
  • 在新代码接收流量之前,把迁移作为部署流水线的一部分,先对生产数据库执行。
  • NUXT_ORM_PROVIDER 为预留项,但目前仅实现 drizzle

相关页面

On this page