Loading...
Loading...
Compare original and translation side by side
Edit your data contract. Prisma handles the rest.
npx createprismaprisma-next initprisma-next initinitcontract inferdb sign编辑你的数据契约,其余工作交给Prisma处理。
npx createprismaprisma-next initprisma-next initinitcontract inferdb signcreateprismacreateprismaprisma-next-contract@prisma-next/migrate-from-<orm>-skilldb.tsprisma-next-runtimeprisma-next-buildprisma-next-contract@prisma-next/migrate-from-<orm>-skilldb.tsprisma-next-runtimeprisma-next-buildcontract.prismacontract.tscontract.jsoncontract.d.tspostgresmongodbinit@prisma-next/<target>psltypescriptvite devprisma-next-build@prisma-next/postgres@prisma-next/mongo@prisma-next/postgres/config@prisma-next/postgres/runtime@prisma-next/postgres/contract-builderprisma-next-contractdb.tssrc/prisma/db.tsdbpn_meta_markerdb initdb signcontract.prismacontract.tscontract.jsoncontract.d.tspostgresmongodbinit@prisma-next/<target>psltypescriptvite devprisma-next-build@prisma-next/postgres@prisma-next/mongo@prisma-next/postgres/config@prisma-next/postgres/runtime@prisma-next/postgres/contract-builderprisma-next-contractdb.tssrc/prisma/db.tsdbpn_meta_markerdb initdb sign<app-root>/
├── prisma-next.config.ts ← project config at repo root
├── src/
│ └── prisma/
│ ├── contract.prisma ← (or contract.ts) — schema source you author
│ ├── contract.json ← emitted by `contract emit` — do not edit
│ ├── contract.d.ts ← emitted by `contract emit` — do not edit
│ └── db.ts ← runtime entry; the rest of `src/` imports from here
└── migrations/
└── app/ ← created on first `migration plan` / `db init`
├── refs/head.json
└── <timestamp>_<slug>/
├── migration.json
├── ops.json
├── end-contract.json
├── end-contract.d.ts
└── migration.tssrc/prisma/db.tssrc/./prisma/db../prisma/dbmigrations/app/app/migrations/app/prisma-next.config.tssrc/src/contract.{prisma,ts}prisma/migrations/<timestamp>_<slug>/app/prisma-next-contractHeads up —currently scaffolds the wrong layout. It writesprisma-next initandprisma/contract.{prisma,ts}at the repo root instead of underprisma/db.ts. Tracked as TML-2532. Until the fix lands, either passsrc/prisma/to--schema-path src/prisma/contract.prisma, or move the scaffoldedinitdirectory intoprisma/aftersrc/prisma/and update theinitpath incontractto match. The canonical layout above is what the demo example uses and what the rest of the framework expects.prisma-next.config.ts
<app-root>/
├── prisma-next.config.ts ← 项目配置文件,位于仓库根目录
├── src/
│ └── prisma/
│ ├── contract.prisma ← (或contract.ts)—— 你编写的Schema源文件
│ ├── contract.json ← 由`contract emit`生成 — 请勿编辑
│ ├── contract.d.ts ← 由`contract emit`生成 — 请勿编辑
│ └── db.ts ← 运行时入口;应用其他部分从这里导入
└── migrations/
└── app/ ← 首次执行`migration plan` / `db init`时创建
├── refs/head.json
└── <timestamp>_<slug>/
├── migration.json
├── ops.json
├── end-contract.json
├── end-contract.d.ts
└── migration.tssrc/prisma/db.ts./prisma/db../prisma/dbmigrations/app/app/migrations/app/prisma-next.config.tssrc/src/contract.{prisma,ts}prisma/migrations/<timestamp>_<slug>/app/prisma-next-contract注意 — 当前生成的结构有误。它会在仓库根目录创建prisma-next init和prisma/contract.{prisma,ts},而非prisma/db.ts下。该问题已记录为TML-2532。在修复完成前,你可以在src/prisma/时传入init,或者在--schema-path src/prisma/contract.prisma完成后将生成的init目录移动到prisma/下,并更新src/prisma/中的prisma-next.config.ts路径以匹配。上述标准结构是演示示例使用的结构,也是框架期望的结构。contract
src/src/first-arc.ts// src/first-arc.ts
import 'dotenv/config';
import { db } from './prisma/db';
// Write a row against the starter model. Adapt the field names to whatever
// model your contract source actually declares — read it first.
await db.orm.User.create({ email: 'alice@example.com' });
// Read it back.
const users = await db.orm.User.select('id', 'email').all();
console.log(users);[{ id: 1, email: 'alice@example.com' }]db.orm.<Model>DATABASE_URL.envdotenv/configprisma-next-queriesprisma-next.config.tssrc/prisma/contract.prismasrc/prisma/contract.tssrc/prisma/contract.{prisma,ts}initcontract infersrc/prisma/db.tsDATABASE_URL.envdb initdb signsrc/src/first-arc.ts// src/first-arc.ts
import 'dotenv/config';
import { db } from './prisma/db';
// 针对基础模型写入一行数据。请根据契约源文件中实际定义的模型调整字段名 — 先查看契约内容。
await db.orm.User.create({ email: 'alice@example.com' });
// 读取数据
const users = await db.orm.User.select('id', 'email').all();
console.log(users);[{ id: 1, email: 'alice@example.com' }]db.orm.<Model>dotenv/config.envDATABASE_URLprisma-next-queriesprisma-next.config.tspostgresmongodbsrc/prisma/contract.prismasrc/prisma/contract.tssrc/prisma/contract.{prisma,ts}initcontract infersrc/prisma/db.ts.envDATABASE_URLdb initdb signcreateprismaprisma-next initcreateprismaprisma-next init<path><path>prisma-next.config.tspostgresmongodbcontract:src/prisma/contract.prismasrc/prisma/contract.tsprisma/contract.{prisma,ts}contractsrc/prisma/db.ts.env.env.exampleDATABASE_URLpnpm prisma-next db verifysrc/prisma/contract.prismaUserprisma-next.config.tspostgresmongodbcontract:src/prisma/contract.prismasrc/prisma/contract.tsprisma/contract.{prisma,ts}contractsrc/prisma/db.ts.env.env.exampleDATABASE_URLpnpm prisma-next db verifysrc/prisma/contract.prismaUserDATABASE_URL.envprisma-next.config.tspnpm prisma-next db initdb verifypnpm prisma-next db initdb updateUser { id, email }pnpm prisma-next contract emitpnpm prisma-next db initdb initdb updatecontract emitDATABASE_URL.envprisma-next.config.tspnpm prisma-next db initdb verifypnpm prisma-next db initdb updateUser { id, email }pnpm prisma-next contract emitpnpm prisma-next db initdb initdb updatecontract emitprisma-next-queriesprisma-next-contractcontract emitdb updatemigration planmigrateprisma-next-runtimeprisma-next-buildprisma-next-queriesprisma-next-contractcontract emitdb updatemigration planmigrateprisma-next-runtimeprisma-next-buildprisma-next.config.ts<path>prisma-next.config.ts<path>prisma-next initcdmkdir my-app && cd my-app
pnpm init # if no package.json yet
pnpm dlx prisma-next init # interactiveprisma-next initmkdir my-app && cd my-app
pnpm init # 如果还没有package.json
pnpm dlx prisma-next init # 交互式
The flags `init` accepts (run `prisma-next init --help` for the source of truth):
- `--target <db>` — `postgres` or `mongodb`.
- `--authoring <style>` — `psl` or `typescript`.
- `--schema-path <path>` — defaults to `prisma/contract.prisma` (or `prisma/contract.ts`). **Pass `--schema-path src/prisma/contract.prisma` (or `.../contract.ts`)** to scaffold into the canonical `src/prisma/` location directly — `init`'s default is wrong today, see [TML-2532](https://linear.app/prisma-company/issue/TML-2532).
- `--force` — overwrite an existing scaffold without prompting (re-running init in a scaffolded directory triggers the reinit flow — `--force` skips the confirmation).
- `--write-env` — also write `.env` (default writes only `.env.example`; `.env` stays under your control).
- `--probe-db` — connect to `DATABASE_URL` once and check the server version against the target's minimum.
- `--strict-probe` — fail init if the probe fails (no-op without `--probe-db`).
- `--no-install` — skip dependency install + initial contract emit.
- `--no-skill` — skip Prisma Next skills installation (air-gapped / restricted environments). The skill cluster is always installed at the project level — never globally — so its version stays locked to the project's Prisma Next version.
`init` writes (when it runs cleanly):
- `prisma-next.config.ts` at the project root.
- The contract source at `--schema-path` — `src/prisma/contract.prisma` if you passed the canonical override, `prisma/contract.prisma` if you accepted the (currently-wrong) default.
- `db.ts` in the same directory as the contract source.
- `prisma-next.md` — a human quick-reference.
- `.env.example` (and `.env` if `--write-env`).
- Updates `package.json` (deps + scripts) and `tsconfig.json` (required compiler options).
- Installs deps and runs `prisma-next contract emit` once.
- Registers Prisma Next skills with the local agent runtime.
**If you took `init`'s default and ended up with a top-level `prisma/` directory** (TML-2532), the cleanup is one move + one config edit:
```bash
mkdir -p src && mv prisma src/prisma
`init`支持的参数(运行`prisma-next init --help`查看权威说明):
- `--target <db>` — `postgres`或`mongodb`。
- `--authoring <style>` — `psl`或`typescript`。
- `--schema-path <path>` — 默认值为`prisma/contract.prisma`(或`prisma/contract.ts`)。**请传入`--schema-path src/prisma/contract.prisma`(或`.../contract.ts`)**,直接生成到标准的`src/prisma/`位置 — 当前`init`的默认路径有误,详见[TML-2532](https://linear.app/prisma-company/issue/TML-2532)。
- `--force` — 覆盖现有脚手架文件,无需提示(在已搭建的目录中重新运行init会触发重新初始化流程 — `--force`会跳过确认)。
- `--write-env` — 同时写入`.env`(默认只写入`.env.example`;`.env`由用户自行管理)。
- `--probe-db` — 连接到`DATABASE_URL`一次,检查服务器版本是否符合目标数据库的最低要求。
- `--strict-probe` — 如果探测失败,则终止init(没有`--probe-db`时无效)。
- `--no-install` — 跳过依赖安装和首次契约生成。
- `--no-skill` — 跳过Prisma Next技能安装(适用于离线/受限环境)。技能集群始终安装在项目级别 — 不会全局安装,因此其版本会与项目的Prisma Next版本保持一致。
当`init`成功运行时,会生成以下文件:
- 项目根目录下的`prisma-next.config.ts`。
- 契约源文件,位于`--schema-path`指定的位置 — 如果传入了标准路径,则为`src/prisma/contract.prisma`;如果接受了当前(错误的)默认值,则为`prisma/contract.prisma`。
- 与契约源文件同目录的`db.ts`。
- `prisma-next.md` — 人类可读的快速参考文档。
- `.env.example`(如果使用`--write-env`,则同时生成`.env`)。
- 更新`package.json`(依赖项 + 脚本)和`tsconfig.json`(必需的编译选项)。
- 安装依赖项并运行一次`prisma-next contract emit`。
- 在本地代理运行时中注册Prisma Next技能。
**如果你接受了`init`的默认值,生成了顶级的`prisma/`目录**(TML-2532),只需一步操作+一处配置修改即可修复:
```bash
mkdir -p src && mv prisma src/prismacontractcontract
Do this before running `db init` — once the marker row is written, restructuring is harder.
After init succeeds, the path converges on *Your first arc — connect, write, read* above. `init` has already seeded a starter contract with `User` and `Post` models (with a relation between them) and run `contract emit` once; the only remaining prerequisites are setting `DATABASE_URL` and initialising the database. Two commands:
1. Set `DATABASE_URL` in `.env` (copy from `.env.example`).
2. Initialise the database: `pnpm prisma-next db init`. Creates tables, indexes, constraints, and writes the marker row — using the starter contract `init` generated.
Then run the snippet from *Your first arc* above against the `User` model. When the user is ready to extend the contract — add more models, change fields, add relations — chain to `prisma-next-contract`. For more queries, chain to `prisma-next-queries`.
**Why this is queries-first, not schema-editing-first.** `init` ships with `User` and `Post` on purpose: the user shouldn't have to design a schema to prove their setup works. Extending the contract is the next move *after* the first arc lands, not part of getting there. If the user asks you to skip straight to *"add a Comment model"* — sure, do that — but get one query green against `User` or `Post` first if there's any doubt the project is wired correctly.
请在运行`db init`前完成此操作 — 一旦写入标记行,调整结构会更困难。
init成功后,路径会汇聚到上方的“你的第一个核心流程 — 连接、写入、读取”。`init`已经生成了包含`User`和`Post`模型(两者有关联)的基础契约,并运行了一次`contract emit`;剩下的前提条件只有设置`DATABASE_URL`和初始化数据库。只需两个命令:
1. 在`.env`中设置`DATABASE_URL`(从`.env.example`复制)。
2. 初始化数据库:`pnpm prisma-next db init`。创建表、索引、约束,并写入标记行 — 使用`init`生成的基础契约。
然后针对`User`模型运行上方核心流程中的代码片段。当用户准备扩展契约 — 添加更多模型、修改字段、添加关联 — 时,引导到`prisma-next-contract`。如需更多查询功能,引导到`prisma-next-queries`。
**为什么先做查询,而不是先编辑Schema**。`init`默认生成`User`和`Post`模型是有目的的:用户无需设计Schema即可验证设置是否成功。扩展契约是完成核心流程后的下一步操作,而非设置过程的一部分。如果用户要求直接“添加Comment模型” — 可以,但如果对项目配置是否正确有疑问,请先确保针对`User`或`Post`的一次查询成功。contract inferdb signdb initmkdir my-app && cd my-app
pnpm init
pnpm dlx prisma-next init --yes --target postgres --authoring pslcontract inferdb signdb initmkdir my-app && cd my-app
pnpm init
pnpm dlx prisma-next init --yes --target postgres --authoring psl
Then, with `DATABASE_URL` set in `.env`:
```bash
pnpm prisma-next contract infer --db "$DATABASE_URL" --output src/prisma/contract.prisma--output--outprisma-next contract infer --helpStringpgvector.Vector(length: 1536)@unique@indexpnpm prisma-next contract emit
pnpm prisma-next db sign
pnpm prisma-next db verify # confirms the DB matches the contract; reports drift if not
然后,在`.env`中设置`DATABASE_URL`后:
```bash
pnpm prisma-next contract infer --db "$DATABASE_URL" --output src/prisma/contract.prisma--output--outprisma-next contract infer --helppgvector.Vector(length: 1536)String@unique@indexpnpm prisma-next contract emit
pnpm prisma-next db sign
pnpm prisma-next db verify # 确认数据库与契约匹配;如果不匹配则报告差异<command> --help| What you want to do | Command | Deeper skill |
|---|---|---|
| Apply the current contract to the DB the first time | | this skill |
Re-emit | | |
| Quick dev-only schema sync (no migration history kept) | | |
| Plan a migration from a contract diff | | |
| Apply pending migrations | | |
| Inspect the live database | | |
| Confirm the DB matches the contract (drift check) | | |
| Bring an existing DB into a PN contract | | this skill (brownfield) |
| Decode a structured error envelope | (read the | |
| Report a bug or request a feature | (file via the feedback skill) | |
<command> --help| 操作目标 | 命令 | 深入技能 |
|---|---|---|
| 首次将当前契约应用到数据库 | | 本技能 |
编辑契约源文件后重新生成 | | |
| 快速开发环境下的Schema同步(不保留迁移历史) | | |
| 根据契约差异规划迁移 | | |
| 应用待处理的迁移 | | |
| 查看实际数据库的Schema | | |
| 确认数据库与契约匹配(差异检查) | | |
| 将现有数据库引入PN契约 | | 本技能(现有数据库场景) |
| 解析结构化错误信息 | (查看 | |
| 报告Bug或请求功能 | (通过反馈技能提交) | |
contract.prismacontract.tsprisma-next-buildprisma-next init--forcecontract.prismacontract.tsprisma-next-buildprisma-next init--forceprisma-next init <project-name>initmkdir foo && cd foo && pnpm dlx prisma-next initinitcontract emitdb initdb updatemigrateinitDATABASE_URLinitcontract inferdb signcontract.jsoncontract.d.tscontract emitDATABASE_URLprisma-next.config.ts.env.envdotenv/configprisma-next-runtimecontract.jsoncontract.d.tscontract emit--outcontract infer--outputprisma-next init <project-name>initmkdir foo && cd foo && pnpm dlx prisma-next initinitcontract emitdb initdb updatemigrateinitDATABASE_URLinitcontract inferdb signcontract emitcontract.jsoncontract.d.tsprisma-next.config.tsDATABASE_URL.envdotenv/config.envprisma-next-runtimecontract.jsoncontract.d.tscontract emitcontract infer--out--output@prisma-next/migrate-from-<orm>-skillcontract inferprisma-next-feedbackprisma db pushdb updatemigration planmigrateprisma-next-migrationsprisma-next db schemaprisma-next-feedback@prisma-next/migrate-from-<orm>-skillcontract inferprisma-next-feedbackprisma db pushdb updatemigration planmigrateprisma-next-migrationsprisma-next db schemaprisma-next-feedbackprisma-next init --helpcontract infer --helpdb sign --help--helpprisma-next init --helpcontract infer --helpdb sign --help--helpdb.tsDATABASE_URLcreateselectpostgresmongodbpsltypescriptprisma-next.config.tsdb.ts.envprisma-next initsrc/prisma/contract.{prisma,ts}src/prisma/db.tsmigrations/app/prisma/initcontract infer --db "$DATABASE_URL" --output src/prisma/contract.prismacontract emitdb signDATABASE_URL.envdb initdb signcontract.jsoncontract.d.tsDATABASE_URLprisma-next.config.tsprisma-next-queriesprisma-next-contractdb.tsDATABASE_URLcreateselectpostgresmongodbpsltypescriptprisma-next.config.tsdb.ts.envprisma-next initsrc/prisma/contract.{prisma,ts}src/prisma/db.tsmigrations/app/initprisma/src/prisma/contract infer --db "$DATABASE_URL" --output src/prisma/contract.prismacontract emitdb sign.envDATABASE_URLdb initdb signcontract.jsoncontract.d.tsprisma-next.config.tsDATABASE_URLprisma-next-queriesprisma-next-contract