Wasp 生产环境数据库部署指南:PostgreSQL 连接、Prisma 迁移与故障排查
【免费下载链接】waspThe batteries-included full-stack framework for the AI era. Develop JS/TS web apps (React, Node.js, and Prisma) using declarative code that abstracts away complex full-stack features like auth, background jobs, RPC, email sending, end-to-end type safety, single-command deployment, and more.项目地址: https://gitcode.com/GitHub_Trending/wa/wasp
导读
本文是 Wasp 框架部署系列中的数据库专题,讲解应用从本地开发走向生产环境时数据库环节的完整处理方式:如何为 Wasp 生成的服务端应用配置生产数据库、如何通过wasp db migrate-dev创建 Prisma 迁移、生产环境中迁移如何被自动应用,以及迁移失败时的排查方法。读完本文,你将掌握 Wasp 项目在 Fly、AWS RDS 等托管 PostgreSQL 服务(或自托管数据库)上落地的完整数据库操作路径,并能独立处理"迁移无法应用""如何用 Studio 查看生产库"等实战问题。
生产数据库要求:PostgreSQL + DATABASE_URL
Wasp 生成的服务端应用统一使用PostgreSQL数据库,这一点在 Wasp 的 Prisma 配置规范中也有明确规定:schema.prisma的datasource块中provider只允许"postgresql"或"sqlite"(后者仅用于本地开发),且url字段必须写为env("DATABASE_URL"),否则 Wasp 无法正常工作,见 Prisma Schema 文件说明。
从 Wasp 的角度看,对生产数据库的唯一硬性要求是:
服务器应用能够通过服务端环境变量
DATABASE_URL访问到该数据库。
也就是说,数据库的部署位置是灵活的:
- 可以与服务器应用运行在同一台机器上(自托管 PostgreSQL);
- 也可以使用托管 PostgreSQL 服务,例如 Fly Postgres、AWS RDS 等。
只要连接串(形如postgresql://user:password@host:port/dbname)能通过DATABASE_URL提供给服务器进程,Wasp 生成的代码即可正常工作。由于部署时.env.server文件会被忽略,你需要在托管平台侧设置该环境变量(例如 Fly 上使用fly secrets set,详见 生产环境变量文档)。
迁移机制:schema 变更如何同步到生产库
Wasp 的数据模型以项目根目录下的schema.prisma文件为唯一事实来源(见 Prisma Schema 文件说明)。每当你修改该文件——例如新增一个 model、修改字段类型或增加约束——都需要创建一条迁移(migration)。
迁移本质上是描述这次 schema 变更的一组 SQL 命令。它的核心价值在于可复用性:同一组迁移可以依次应用到多个数据库上。多人在同一个项目上协作时,可以各自把同样的变更应用到本地数据库;部署上线时,同样的变更也会应用到生产数据库,从而保证所有环境的 schema 始终一致。
创建迁移:wasp db migrate-dev
修改完 Prisma schema 后,在 Wasp 项目根目录运行:
wasp db migrate-dev该命令会在项目的migrations目录下生成一条新迁移,其中包含描述本次 schema 变更的 SQL 语句。从源码看,这条命令并非直接调用 Prisma CLI,而是经过 Wasp 的封装:CLI 命令入口 解析参数后,在生成的.wasp/out应用中执行 Prisma 的migrate dev子命令,并把生成的迁移文件从生成目录回拷到源码的migrations目录(见 DbGenerator 的迁移任务实现)。
实际执行时,Wasp 会附带--skip-generate(跳过自动重新生成 Prisma Client,由后续编译流程统一处理)和--skip-seed(避免迁移时自动执行种子脚本)。此外,CLI 还支持两个可选参数:
# 仅生成迁移 SQL 文件,不实际应用到数据库 wasp db migrate-dev --create-only # 为迁移指定一个可读名称,便于后续在 migrations 目录中识别 wasp db migrate-dev --name add_email_to_user这两个参数在 CLI 解析逻辑 和 Prisma 参数组装逻辑 中均有对应实现:--create-only会追加 Prisma 的--create-only标志,--name则透传为 Prisma 的--name参数。
开发环境:迁移自动应用
在开发阶段,只要你运行wasp start,所有未应用的迁移就会自动应用到本地开发数据库。这也是本地开发默认使用 SQLite(或本地 PostgreSQL)时能即时反映 schema 变更的原因。
生产环境:启动前自动应用待迁移
在生产环境中,服务器应用在正式启动前会先检查是否存在待应用的迁移;若有,则先应用它们,再启动服务器。这样数据库 schema 始终与 Prisma schema 保持同步。
这一行为的底层实现值得展开说明:
生成的服务端 package.json 模板中定义了两个 npm 脚本(见 服务端 package.json 模板):
start:开发环境使用,直接启动打包后的服务器;db-migrate-prod:prisma migrate deploy --schema=../db/schema.prisma,以非交互式方式将migrations目录中所有尚未应用的迁移依次应用到数据库——这正是为生产环境准备的关键一步,因为它不会在遇到待定变更时弹出交互提示(这是migrate dev与migrate deploy的核心区别);start-production:由生成器动态填充。
start-production脚本的生成逻辑位于 ServerGenerator.hs:当应用存在实体(即使用数据库)时,它被生成为:
npm run db-migrate-prod && NODE_ENV=production npm run start即:先执行prisma migrate deploy应用待迁移,再以生产模式启动服务器。若应用不含任何实体,则退化为仅NODE_ENV=production npm run start。
- Docker 部署路径同样遵循该约定:Dockerfile 模板 在生产镜像的
ENTRYPOINT中直接写入npm run start-production,同时通过COPY db/ .wasp/out/db/将迁移文件与 schema 一并带入镜像,保证容器启动时能够完成迁移。
迁移失败:常见原因与排查
迁移可能在应用时与数据库现有数据发生冲突而失败,例如:
- 给一个已存在重复值的字段添加
@unique约束; - 将一个可空字段改为非空但表中存在 NULL 值;
- 其他任何与现有数据不兼容的 schema 变更。
发生失败时的表现:服务器应用会记录错误日志并停止启动。此时你需要连接到生产数据库查看具体原因。
推荐排查手段:检查数据库中的_prisma_migrations表,失败的那条迁移会记录在其中(该表由 Prisma 自动维护,记录每条迁移的名称、时间戳、校验和与执行状态)。
修复步骤(以添加唯一约束遇重复值为例):
- 从数据库中清理重复值,使该字段满足新约束;
- 从
_prisma_migrations表中删除那条失败的迁移记录; - 重启服务器应用,
start-production会重新尝试应用该迁移。
提示:
wasp db studio无法用于查看生产库的_prisma_migrations表(Studio 只展示 Prisma 模型中定义的业务表),如需查看可改用通用数据库管理工具,如 DBeaver 或 pgAdmin。
连接生产数据库:wasp db studio 的正确姿势
开发阶段,你可以用wasp db studio打开一个基于 Web 的数据库管理界面来检视本地数据库(其底层是prisma studio,见 DbGenerator 的 studio 任务)。
同一工具也可以用来检视生产数据库,做法是在运行命令前,通过终端环境变量把DATABASE_URL指向生产库:
DATABASE_URL="postgresql://user:password@host:port/dbname" wasp db studioWasp 的 Prisma 相关命令(包括 studio)会从服务器目录读取DATABASE_URL(参见 runPrismaCommandAsJobFromWaspServerDir 的注释),因此以终端环境变量形式注入即可覆盖默认配置。
为什么要用终端变量而不是 .env.server
把生产库的DATABASE_URL写进项目的.env.server文件也能让wasp db studio生效,但存在一个隐患:你可能会忘记移除它。一旦该文件保留了生产库地址,之后在开发环境执行wasp start时,迁移(包括wasp db migrate-dev触发的变更)就会意外地作用到生产数据库上,造成不可控的数据改动。
因此官方强烈推荐:只在当前终端会话中设置DATABASE_URL环境变量,用完即止,避免污染项目配置。
如果你使用的是 Fly.io 托管的 PostgreSQL,官方还专门撰写了一份指南,介绍如何安全地在该场景下对生产库运行wasp db studio——核心思路即上述"会话级环境变量注入",同时可结合 Fly 的数据库代理(proxy)机制建立本地连接后再执行 Studio。
小结
围绕生产环境的数据库,本文覆盖了三条主线:
- 连接:生产数据库必须是 PostgreSQL,通过服务端环境变量
DATABASE_URL提供给 Wasp 生成的应用,部署位置(同机自托管或 Fly Postgres、AWS RDS 等托管服务)不限; - 迁移:schema 变更通过
wasp db migrate-dev(支持--create-only与--name)落成migrations目录中的迁移文件;开发环境由wasp start自动应用,生产环境由start-production脚本(即prisma migrate deploy+ 生产模式启动)在服务启动前自动应用,该逻辑在 package.json 模板、ServerGenerator.hs 与 Dockerfile 模板 中均可验证; - 排障与检视:迁移失败时通过
_prisma_migrations表定位问题、清理冲突数据后重启服务重试;检视生产数据则使用DATABASE_URL="..." wasp db studio的会话级注入方式,避免污染.env.server而对生产库造成意外写入。
配合 生产环境变量配置 与 Prisma Schema 文件规范,即可完整打通 Wasp 应用从本地开发到生产上线的数据库链路。
【免费下载链接】waspThe batteries-included full-stack framework for the AI era. Develop JS/TS web apps (React, Node.js, and Prisma) using declarative code that abstracts away complex full-stack features like auth, background jobs, RPC, email sending, end-to-end type safety, single-command deployment, and more.项目地址: https://gitcode.com/GitHub_Trending/wa/wasp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考