LogoLaunchSaaS

数据库

LaunchSaaS 通过 Drizzle ORM 支持 PostgreSQL、MySQL 和 SQLite。连接 Neon、Supabase、PlanetScale 或自托管数据库,实现类型安全的查询和迁移。

LaunchSaaS 使用 Drizzle ORM 进行类型安全的数据库操作。开箱即支持三种数据库 Provider — PostgreSQL、MySQL 和 SQLite — 每种都有独立的 package。

选择数据库 Provider

ProviderPackage适用场景
PostgreSQL(默认)@launchsaas/db-pg生产应用、托管服务(Neon、Supabase、Railway)
MySQL@launchsaas/db-mysql已有 MySQL 或 PlanetScale 的项目
SQLite@launchsaas/db-sqlite原型开发、边缘运行时、本地开发

参考 app 默认使用 PostgreSQL。切换 Provider 需要修改你的 app 中以下三个文件:

1. apps/your-app/src/db/index.ts — 修改 Provider 导出:

export * from "@launchsaas/db-pg"; // PostgreSQL(默认)
// export * from "@launchsaas/db-mysql";   // MySQL
// export * from "@launchsaas/db-sqlite";  // SQLite
export * from "./tables";

2. apps/your-app/src/env.ts — 修改 db keys 导入:

import { keys as db } from "@launchsaas/db-pg/keys"; // PostgreSQL(默认)
// import { keys as db } from "@launchsaas/db-mysql/keys";   // MySQL
// import { keys as db } from "@launchsaas/db-sqlite/keys";  // SQLite

这会设置 Drizzle Kit 读取的正确 DATABASE_TYPE 值。

3. apps/your-app/drizzle.config.ts — 更新 schema 路径指向对应的 provider package:

export default defineConfig({
  dialect: env.DATABASE_TYPE,
  schema: ["../../packages/databases/db-pg/src/tables/*", "./src/db/tables/*"], // 将 db-pg 改为 db-mysql 或 db-sqlite
  out: "./drizzle",
  dbCredentials: { url: env.DATABASE_URL },
});

切换 Provider 后,重新生成迁移:

pnpm run db:generate
pnpm run db:migrate

设置

创建数据库

建议使用托管的 PostgreSQL 数据库服务。它们提供简单的设置和管理,通常包括足以开始使用的免费套餐。

Neon(推荐)

Neon 是一个无服务器 PostgreSQL 服务,具有出色的开发者体验。

设置步骤:

  1. neon.tech 创建账户
  2. 创建新项目
  3. 创建数据库
  4. 从仪表板获取连接字符串
  5. 将连接字符串添加到 .env 文件:
DATABASE_URL="postgres://user:[email protected]/database?sslmode=require"

Supabase

Supabase 提供 PostgreSQL 数据库以及身份验证和存储等附加功能。

设置步骤:

  1. supabase.com 创建账户
  2. 创建新项目
  3. 点击"Connect"按钮
  4. 在"Transaction pooler"部分获取连接字符串
  5. 将连接字符串添加到 .env 文件:
DATABASE_URL="postgres://postgres:[email protected]:6543/postgres"

初始化数据库

配置数据库 URL 后,初始化数据库:

pnpm run init

此命令将:

  1. 生成数据库迁移
  2. 将迁移应用到你的数据库
  3. 创建管理员用户

运行此命令前,请确保已在 .env 文件中配置了 DATABASE_URL

其他数据库选项

自托管

Docker

在 Docker 容器中运行 PostgreSQL 用于本地开发:

docker run --name launchsaas-postgres -e POSTGRES_PASSWORD=mypassword -d -p 5432:5432 postgres

连接字符串:

DATABASE_URL="postgres://postgres:mypassword@localhost:5432/postgres"

本地安装

postgres.org 直接在你的机器上安装 PostgreSQL。

其他托管服务

数据库命令

命令描述
pnpm run db:generate从架构更改生成迁移
pnpm run db:migrate将迁移应用到数据库
pnpm run db:push直接推送架构更改(仅开发环境,跳过迁移)
pnpm run init:better-auth重新生成 Better Auth 架构(在更改认证配置后)
pnpm run init:db推送当前 app 架构(pnpm run init 会调用)

针对不同环境运行命令

默认情况下,根命令会代理到 apps/launchsaas,并加载该 app 的 .env 文件。要针对不同环境(如生产或预发布)运行命令,请通过 app package 直接调用 drizzle-kit 并指定不同的 env 文件:

# 推送架构到生产数据库
pnpm --filter your-app exec dotenv -e .env.production -- drizzle-kit push --config drizzle.config.ts

# 在预发布数据库上运行迁移
pnpm --filter your-app exec dotenv -e .env.staging -- drizzle-kit migrate --config drizzle.config.ts

# 使用生产数据库生成迁移
pnpm --filter your-app exec dotenv -e .env.production -- drizzle-kit generate --config drizzle.config.ts

针对生产环境运行数据库命令时要小心。在运行迁移之前始终备份数据,并且在生产环境中优先使用 db:migrate 而不是 db:push

架构组织

LaunchSaaS 现在将 DB 所有权拆分到 provider package 与 app:

  • packages/databases/db-pg/src/tables/ 保存模板核心共享的 PostgreSQL 表
  • packages/databases/db-mysql/src/tables/ 提供同一套核心共享 MySQL 表
  • packages/databases/db-sqlite/src/tables/ 提供同一套核心共享 SQLite 表
  • apps/launchsaas/src/db/index.ts 负责把 app 绑定到选中的 DB provider package
  • apps/launchsaas/drizzle.config.ts 拥有 Drizzle 配置与迁移输出
  • apps/launchsaas/src/db/tables/ 预留给 app-specific 额外表

核心共享表位于 packages/databases/db-pg/src/tables/

文件描述
auth.ts身份验证表(由 Better Auth 自动生成)
order.ts确认的货币交易订单表
entitlement.ts用户产品访问权限表
index.ts重新导出所有架构

不要手动编辑 auth.ts - 它是自动生成的。更改身份验证配置后运行 pnpm run init:better-auth

订单表(Order Table)

表示确认的货币交易:

  • 在支付确认时创建
  • 一次性产品在结账完成时创建订单
  • 订阅产品在每次成功支付时创建订单(循环订单)
  • 包含:提供商信息、产品详情、金额、货币、元数据

权限表(Entitlement Table)

表示用户对产品的访问权限:

  • 当订单支付时授予/延长
  • 一次性产品在结账时创建状态为"active"的权限
  • 订阅产品创建状态为"pending"的权限,首次支付后变为"active"
  • 包含:订阅周期信息、取消状态、提供商订阅 ID
  • 支持多个支付提供商(Stripe、Creem 等)

常见问题

连接问题

如果你在连接数据库时遇到问题:

  1. 检查 DATABASE_URL 格式是否正确
  2. 确保你的 IP 地址在数据库防火墙设置中被允许
  3. 验证数据库用户具有正确的权限
  4. 检查是否有任何网络限制

迁移问题

如果你遇到数据库迁移问题:

  1. 检查架构定义是否有错误
  2. 确保迁移脚本格式正确
  3. 尝试手动运行迁移以查看详细错误

参考资料

下一步