进阶 www.prisma.io 2026-10-12 01:56:59 · 16 阅读

第2章 免费启动:使用 Prisma 在 Postgres 上构建 TypeScript 应用

免费启动基于 Prisma 的 Postgres TypeScript 应用

从空目录开始,在 Prisma Compute 上运行一个带有 Prisma Postgres 数据库的实时 TypeScript 应用,文中列出了免费套餐的配额限制。 使用 Prisma CLI 是构建带有 Postgres 数据库的 TypeScript 应用的最快路径:它能自动搭建应用框架,在本地 Prisma Postgres 数据库上运行(无需账号),并在登录后将应用部署到 Prisma Compute 并在那里创建数据库。所有操作均在免费套餐下进行,无需信用卡。以下步骤演示了手动操作的过程,下方“配合你的 AI 代理使用”中的提示词可端到端自动化完成这一流程。 Prisma Composer 用于声明你的应用:包括服务、数据库及其连接方式。Prisma ORM 为数据提供类型定义。Prisma Postgres 负责数据存储:开发时存储在本地,部署后存储在平台上。一份声明驱动所有环节:同一个 module.ts 既可在本地运行应用,也可将其部署到 Prisma Compute。整个过程预计耗时约 15 分钟。 本教程使用 Hono 模板,让你在每个步骤都能通过 curl 验证一个小型 API。其他模板也适用相同的流程,框架指南中会有详细说明。

前置条件

- Node.js 22.18 或更高版本(若使用 24 系列,需 24.11 或更高;推荐 24),或 Bun - 如果使用 npm,需 npm 11.6.0 或更高版本。Node.js 22 自带 npm 10,因此请先运行 `npm install --global npm@11`;create-prisma 的前置条件中解释了原因 - 部署步骤需要 Prisma Data Platform 账号,创建免费,免费套餐下无需信用卡 - 无需预置数据库:本地运行会自动配置本地 Prisma Postgres,部署时会自动配置线上数据库,两者均基于你的 Composer 声明

已有应用? 保留现有代码,在旁边添加一个小型 Prisma Composer 声明即可:每个服务端对应一个 service.ts,以及一个 module.ts。服务端从 service.port() 读取端口并绑定 0.0.0.0;“移植现有应用”章节列出了其他必要更改,并提供一个让 AI 代理自动完成的提示词;“引入现有应用”提供了一个完整示例。一旦 `npm run build` 和 `npx prisma dev module.ts` 能正常运行,请从第 5 步继续。SvelteKit 和 Deno 应用目前尚不支持部署到 Prisma Compute。

免费套餐包含什么 本教程中的所有操作均在免费套餐下进行:每月 $0,无需信用卡,无时间限制,无按用量计费。以下是定价页上列出的限制(页面同时也列出了付费套餐)。这些限制适用于你的整个工作区(Workspace),它是 Prisma 账号中承载所有项目和数据库的计费单位,因此每个数值是工作区内所有资源共享的,而非分配给每个数据库。

Prisma ORM 在两款产品中均为可选:Prisma Postgres 可配合任何 PostgreSQL 客户端使用,Compute 也可运行不使用 Prisma ORM 的应用。参见“使用 Compute 是否需要 Prisma ORM?”。本教程的脚手架使用了 Prisma ORM 8,这是一个候选发布版本;参见“发布状态”。

Prisma Postgres | 限制项 | 免费套餐 | | 操作数 | 每月 200,000 次 | | 存储 | 1.01 GB | | 数据库数量 | 50 个 | | 数据传输 | 无限制 | | 连接池连接数 | 10 | | 直接连接数 | 10 | | 自动备份 | 无 |

每个查询计为一次操作,无论读写。参见“什么是操作?”。直接连接是指 pg_dump 等 PostgreSQL 工具建立的连接,其中 10 个中有 5 个保留给平台操作使用;参见“连接限制”。免费套餐无自动备份,且 Prisma Postgres 尚不支持将数据库恢复到历史时间点,因此请通过直接连接使用 pg_dump(PostgreSQL 命令行备份工具)自行保留副本。参见“备份”。

Prisma Compute | 计量项 | 免费套餐 | | 请求数 | 每月 1,000,000 次 | | 预留内存 | 每月 360 GB-小时 | | 活跃 CPU | 每月 4 vCPU-小时 | | 出站带宽 | 每月 10 GB |

GB-小时指分配 1 GB 内存一小时;vCPU-小时指 1 个虚拟 CPU 运行一小时。内存仅在应用运行中或你选择保持其唤醒状态时计算,因为空闲应用会缩放至零:停止运行且不产生费用。出站带宽指应用发送到互联网的数据,入站请求不计入。它与数据库无限制的数据传输是分开的:免费套餐下,Compute 每月包含 10 GB 出站带宽。参见“Compute 定价”了解每个计量项的含义。

检查用量并升级 免费套餐不按用量计费,因此达到限额不会产生额外费用。操作数及 Compute 的四个计量项是月度限额,而存储和数据库数量不与月份绑定。

要查看数据库的用量,运行 `npx prisma postgres usage `,或在 Prisma Console 中跟踪用量;参见“计费与限额”。CLI 和 API 中 Compute 的用量报告功能仍在建设中。

若要超越限额,请将工作区升级为付费套餐。付费套餐包含更多的操作数、存储和请求额度,超出部分按用量计费。Compute 的内存、CPU 和带宽在付费套餐中按使用量计费,可设置消费上限。费率详见定价页。

配合你的 AI 代理使用 如果你倾向于将任务交给编码代理,此提示词将运行与入门指南相同的流程,并自动选择 Hono 模板: 该提示词使用 npm 和 Node.js。在 Bun 环境下,请将 `npm create prisma@latest --` 替换为 `bun create prisma@latest`,`npx` 替换为 `bunx`,`npm run` 替换为 `bun run`。

配合你的 AI 代理使用 创建一个由 Prisma Composer 和 Prisma ORM 构建的新 Hono API,在本地运行,并部署到 Prisma Compute。

首先检查版本:`node --version` 必须显示 22.18 或更高(24 系列需 24.11 或更高)。如果使用 npm,`npm --version` 必须显示 11.6.0 或更高;Node.js 22 自带 npm 10,因此若 npm 版本较低,请先在步骤 1 前运行 `npm install --global npm@11`。

1. 搭建框架:`npm create prisma@latest -- my-app --template hono --provider postgres --yes`。然后在 `my-app` 目录下运行 `npx prisma@latest init`,确认脚手架安装的 Prisma 代理技能是最新的,并使用它们。 2. 首先阅读 `module.ts` 和 `service.ts`:Composer 模块负责配置数据库和服务,`dev` 和 `deploy` 命令即基于此操作。 3. 构建并在本地运行:`npm run build`,然后在后台启动 `npx prisma dev module.ts`,等待其打印出本地 URL。这将配置本地 Prisma Postgres 数据库并应用契约;无需 DATABASE_URL。应用首次查询时会自动填充示例用户。使用 curl 验证本地 URL 的 /users 端点返回填充的用户,然后停止 `dev`。 4. 部署:检查 `npx prisma auth whoami`;如果未登录,停止并要求运行 `npx prisma auth login`(会打开浏览器)。脚手架已在 `migrations/app/` 下编写了基线迁移;注意其目录名,以 `_init` 结尾。脚手架的 `prisma.config.ts` 中的 `composer` 部分已设置部署区域,无需添加。然后运行 `npx prisma deploy module.ts`,并使用 curl 验证线上 URL 的 /users 端点。部署会创建项目并根据模块声明配置数据库;无需传递 DATABASE_URL。 5. 演进模式:在 `src/prisma/contract.prisma` 的 User 模型中添加 `role String @default("member")`,运行 `npx prisma contract emit`,在 `src/prisma/users.ts` 的类型化 select 和返回对象中添加 `"role"`,并使用 `npx prisma migration plan --name add-user-role --from ` 规划迁移。然后再次运行 `npm run build` 和 `npx prisma deploy module.ts`,验证线上 /users 现在返回 `role: "member"`,且 createdAt 值与之前相同。

1. 搭建应用 一条命令即可创建带有 Prisma ORM 集成的 Composer 声明应用: bun create prisma@latest my-app --template hono --provider postgres --no-deploy 响应提示中的契约编写风格、包管理器和代理技能,或传递 `--authoring`、`--package-manager` 和 `--skills` 标志以跳过(参见 create-prisma 参考;Deno 项目目前尚不支持部署到 Prisma Compute,因此本教程使用 Node.js 或 Bun)。然后进入项目: cd my-app 如果你使用编码代理,请运行一次 `npx prisma@latest init`。脚手架已运行过该命令,因此在新项目上 init 会确认设置并报告每个步骤已完成:Prisma 包内置的代理技能已同步,package.json 中有一个 postinstall 钩子(`prisma skills sync || exit 0`)在每次安装时重新同步,另有一个 skills:sync 脚本用于手动刷新。再次运行 init 是修复 Prisma 包升级后设置问题的方法。参见“技能”。

2. Composer 应用 从声明开始,因为它是后续所有命令的操作对象。脚手架在两个文件中声明了整个应用,prisma.config.ts 保存部署配置。module.ts 即应用本身:它配置 Prisma Postgres 数据库和服务,并将两者连接起来: module.ts import { module } from "@prisma/composer"; import { postgres } from "@prisma/composer-prisma-cloud/orm";

import { appContract } from "./src/prisma/composer.ts"; import app from "./service.ts";

export default module("my-app", ({ provision }) => { const database = provision( postgres({ name: "database", contract: appContract, config: "./prisma.config.ts", }), { id: "database" }, );

provision(app, { deps: { database } }); }); service.ts 声明服务本身:名称、对数据库的依赖关系,以及构建方式: service.ts import node from "@prisma/composer/node"; import { compute } from "@prisma/composer-prisma-cloud"; import { postgres } from "@prisma/composer-prisma-cloud/orm";

import { appContract } from "./src/prisma/composer.ts";

export default compute({ name: "app", deps: { database: postgres(appContract), }, build: node({ module: import.meta.url, entry: "./dist/server.mjs" }), }); prisma.config.ts 是本项目的 Prisma 配置:Prisma CLI 读取它,但应用代码永远不会导入它。其 orm 部分将 Prisma ORM 指向你的契约和数据库,skills 部分列出了你在提示中选择的代理,deploy 配置即 composer 部分:部署应用的扩展和保存部署状态存储。composer 部分已命名首次部署创建项目所需的区域 us-east-1,因此部署前无需设置。若要部署到其他位置,请在首次部署前在此处更改区域;区域 ID 列表见“限制”。

下方文件展示的是选择使用 Claude Code 编写 Prisma 模式且选择 Claude 作为代理技能的情况。你的 skills 列表保存了你选择的代理,TypeScript 编写将契约指向 contract.ts 并添加输出路径。 prisma.config.ts import { definePrismaConfig } from "prisma/config"; import { defineConfig as ormConfig } from "@prisma/orm-postgres/config"; import { defineConfig as composer } from "@prisma/composer/config"; import { nodeBuild } from "@prisma/composer/node/control"; import { prismaCloud, prismaState } from "@prisma/composer-prisma-cloud/control";

export default definePrismaConfig({ skills: { agents: ["claude"], }, orm: ormConfig({ contract: "./src/prisma/contract.prisma", db: { connection: process.env.DATABASE_URL!, }, }), composer: composer({ extensions: [prismaCloud({ region: "us-east-1" }), nodeBuild()], state: prismaState(), }), }); 注意声明中没有连接字符串。数据库是一个声明的依赖项,由契约提供类型,Composer 会在应用运行的任何位置注入连接。orm 部分中的 DATABASE_URL 仅用于直接连接数据库的 ORM 命令,例如步骤 4 末尾的 db:* 脚本;prisma dev 和 prisma deploy 不需要它。声明是普通的 TypeScript:`npx tsc --noEmit` 可检查连接,错误会在编译而非部署阶段失败。Composer 完整覆盖模型:模块、服务、依赖项和一方构建块。

3. Prisma ORM 数据模型 数据层位于 src/prisma/ 下。你的模式是 src/prisma/contract.prisma 中的初始契约;`npm run contract:emit` 将其编译为查询类型检查所依据的契约工件,src/prisma/db.ts 是路由处理程序导入的类型化客户端。src/index.ts 中的 /users 路由是调用普通 Prisma ORM 查询的普通 Hono 代码。 准备好对自有数据进行建模时,修改契约,重新生成,编译器会引导你处理受影响的每个查询。基础章节涵盖了查询模式。

4. 在本地 Prisma Postgres 上运行 构建服务端,然后在本地启动整个声明: bun run build bunx prisma dev module.ts dev 会配置本地 Prisma Postgres 数据库,应用契约,启动服务,并在一切就绪时打印应用本地 URL。无需账号、凭据或连接字符串;参见“本地开发”了解本地平台如何工作。 应用首次查询数据库时会自动填充示例用户。确认 API 返回填充的行。dev 持续运行直到按下 Ctrl-C,因此在第二个终端中运行 curl。dev 还会选择空闲端口并打印 URL,如果与此处显示的 3000 不同,请使用它打印的 URL: curl http://localhost:3000/users [ { "id": "1", "email": "alice@prisma.io", "username": "alice", "name": "Alice", "createdAt": "2026-08-24 13:51:34.797+00" }, { "id": "2", "email": "bob@prisma.io", "username": "bob", "name": "Bob", "createdAt": "2026-08-24 13:51:34.803+00" }, { "id": "3", "email": "carol@prisma.io", "username": "carol", "name": "Carol", "createdAt": "2026-08-24 13:51:34.804+00" } ] 如果偏好框架自带的开发服务器,`npm run dev` 可直接运行。Composer 不管理该模式,因此应用需要在 DATABASE_URL 中提供你自己的数据库。使用 CLI 创建一个与模块名称不同的项目中的数据库,以免与步骤 5 部署创建的项目冲突: bunx prisma auth login bunx prisma project create my-app-local bunx prisma postgres create mydb `postgres create` 仅打印一次连接字符串;将其导出为 DATABASE_URL,如需更多可用 `npx prisma postgres connection create mydb` 生成。package.json 中的 db:* 脚本用于初始化和验证该数据库。参见 postgres。

5. 将应用和数据库部署到 Prisma Compute 登录一次(会打开浏览器): bunx prisma auth login 部署的数据库通过你提交的迁移演进,因此第一个迁移必须创建起始模式。脚手架已将其规划为 migrations/app/_init;请随代码一起提交。你将在步骤 7 中基于此链式添加下一个迁移。 构建并部署相同的声明: bun run build bunx prisma deploy module.ts Composer 会根据模块名创建项目,区域取自 prisma.config.ts 的 composer 部分,配置 module.ts 中声明的 Prisma Postgres 数据库,将其连接到服务并启动应用。无需传递环境文件,因为部署的数据库和本地一样均来自声明。一切就绪后,部署会打印其创建的内容,将应用的每个部分与成为的平台资源并列显示,以及公共 URL: my-app ├─ database postgres-database db_abc123 └─ app compute-service cps_abc123 https://xyz.ewr.prisma.build 模块名在工作区内必须唯一:deploy 在工作区中查找模块名,并复用上该模块部署过的项目而非创建新项目。如果存在一个无法验证托管状态的同名项目(例如从不同检出部署的),deploy 会停止并抛出 HostedStateBootstrapError,并指明一个你未选择的项目 ID。使用 --name 以不同名称部署,或重命名 module.ts 中的模块: bunx prisma deploy module.ts --name my-app-tutorial

6. 验证线上 URL curl https://xyz.ewr.prisma.build/users 相同的三个用户返回,现在由位于数据库旁边的生产环境提供,由部署应用的首次查询填充。可安全地多次重新部署:再次构建,再次部署,平台仅应用差异。这包括删除操作,因为你的模块是事实来源:从 module.ts 删除一个配置项,再次部署,资源将从平台消失。参见“移除资源”。

7. 演进数据模型 在线应用总会超越初始模式,因此给用户添加角色。在契约中添加一行: src/prisma/contract.prisma // use prisma-8

model User { id Int @id @default(autoincrement()) email String @unique username String? name String? role String @default("member") posts Post[] createdAt TimestamptzString @default(now()) updatedAt temporal.updatedAtString() } 重新生成契约,然后规划承载此更改的迁移,基于步骤 5 提交的基线迁移链式进行: bunx prisma contract emit bunx prisma migration plan --name add-user-role --from _init --from 指定你正在基于其构建的迁移,此处必填:Composer 部署默认不会设置 migration plan 链式依赖的 db ref,因此缺少它的计划会再次描述所有表。迁移计划和迁移参考涵盖了默认值、ref 以及如何保持计划自动链式。 该计划仅包含你的更改。像其他差异一样审查它,使用 migration show 或阅读生成的包: ALTER TABLE "public"."User" ADD COLUMN "role" text DEFAULT 'member' NOT NULL 生成步骤也更新了查询类型,因此在 src/prisma/users.ts 的路由类型化 select 中包含新字段,在 .select(...) 列表中添加 "role",在返回对象中添加 role: user.role: src/prisma/users.ts const users = await db.orm.public.User.select("id", "email", "username", "name", "role", "createdAt").limit(limit).all(); 这就是 Prisma ORM 循环:契约是事实来源,生成步骤重新生成类型,编译器指向受影响的每个查询。 如果希望先在本机查看更改,再次运行 `npm run build` 和 `npx prisma dev module.ts`;本地数据库启动时应用新迁移,/users 也会在那里返回 role。然后再次构建并部署: bun run build bunx prisma deploy module.ts 部署会将已提交的迁移就地应用到部署的数据库。相同的用户返回,带有 role: "member"(由列默认值填充),createdAt 时间戳不变;没有资源被删除或重建: curl https://xyz.ewr.prisma.build/users [ { "id": "1", "email": "alice@prisma.io", "username": "alice", "name": "Alice", "role": "member", "createdAt": "2026-08-24 18:40:06.375+00" } ]

8. 清理(可选) 项目会持续运行,直到你将其移除。删除项目会移除服务和数据库,因此命令要求重复输入项目 ID 以确认(使用 `npx prisma project list` 查找): bunx prisma project delete --confirm

后续步骤

- 学习 Composer:服务、数据库、存储和定时作业之间的类型化契约。 - 选择你的框架:Next.js、Nuxt、Astro、NestJS、TanStack Start 等的相同流程。 - 分支与预览:每个分支如何获得独立环境。 - 学习基础:读取、写入、关联和事务。 - 推送时部署:连接 GitHub 并添加部署工作流,使每次推送都进行部署,每个分支带有预览环境。

在 GitHub 上编辑 选择 Prisma ORM 配置路径:在新或现有项目中尝试 Prisma ORM 的最快路径。 部署你的第一个应用:从终端到 Prisma Compute 上的实时 URL,使用 Prisma Composer 将 TypeScript 应用从零开始或从现有应用部署。

评论 (0)