@btravstack/prisma (英语)
Prisma 启动程序
@btravstack/core数字 :DATABASE_URL约束通过Config作为中间器皿的每克观测, 以及一个客户 其池是应用范围。 普里斯马 第8条。 。 。 .
pnpm add @btravstack/prisma @btravstack/core @btravstack/config @btravstack/di unthrown \
@prisma/[email protected] [email protected]
安装所需的对等器, 因此应用程序持有每个的单一副本;
temporal-polyfill 是 Postgres 软件包中来自 rc.14 的对等端。 这个
@prisma/orm-postgres 端点是 ^8.0.0-rc.11,两端均测试:a
应用程序已保存在 rc.11 上.
以释放的迁移升级 : 升级 @btravstack/prisma 联 合 国
@btravstack/* 同伴们 离开普里斯玛的地方 没有合同、移民或
数据库标记更改。 从 rc.11 更新 Prisma 本身
发布迁移,并重新签名每个数据库,这是Prisma的路径
大于此软件包; 参见
支持的 Prisma 列车编辑 prisma CLI是你的,作为一个dev依赖:客户是
从 因此,没有这个包裹可以运送.
节点 >=22.12。 。 。 .
生产包装: 被钉住的 Postgres 外观要求
@prisma/orm-toolchain,包括其CLI引擎对等和构建工具
关闭。 A 类 /runtime 导入和 pnpm deploy --prod 不删除这些
过渡性依赖。 将合同排放量保持在建造阶段
在部署中迁移任务, 启用严格的对等器; 无工具链
运行时间 : 上游被封锁。 。 。 .
该节记录了明显的分裂和跟踪的依赖.
这是Prisma 8号,这是一个不同的软件包家族,而不是一个版本
颠倒 -- @prisma/orm-postgres 替换 @prisma/client 财务报告和审定财务报表 @prisma/adapter-pg
两者,没有 @prisma/instrumentation用于 Prisma 7
@btravstack/[email protected]。 。 。 .
实例
import { prismaDatabase } from "@btravstack/prisma";
import { contractFromJson } from "@prisma/orm-postgres/static";
const contract = contractFromJson<Contract>(contractJson);
const database = prismaDatabase("OrderDatabase")({
client: ({ url, middleware }) => postgres({ contract, url, middleware }),
});
这就是整个地表. database 是一个 模块 携带端口 a
组成根为; 提供者绑定 DATABASE_URL聪明的
客户提供商和健康检查在其中:
export const PersistenceModule = Module("Persistence")({
imports: [database],
exports: [database.port],
needs: [Env],
});
客户类型是你的,这是故意的. 一个Prisma 8 客户端是
类型 发射 Contract 从 contract.json这样
没有这个包裹可以运送。 从Prisma rc.19,把JSON变成
输入值一次 contractFromJson<Contract>(contractJson) 通过
contract 改为 postgres({ contract, ... })编辑 client 箭头在那边
合同和这个启动器相会, 端口按它的确切键
返回。 散开 middleware 它将你交给客户:
下面的每克观测数据来自此.
它拥有的
DATABASE_URL结束Config。 。 。 . 缺少或空白值是一个模型ConfigInvalid命名变量, 而不是抛出—— 所以一个配置错误 部署出口78与原因在 stderr 而不是崩溃在 第一个查询.- 池从生. 提供商是 聪明这样
release关上它 包括跑后失败的靴子. - 一个在任何工作运行前回答的数据库. 打开范围运行
健康检查的探测器, 所以一个新鲜的池子 在它第一次爆发之前就已经核实了
和不回答启动失败的数据库
DatabaseUnreachable——数据库的名称和驱动原因,从不 URL (中文(简体) ). - 角色行安全适用于. 任何表格都有行级安全
启用,一个超级用户的角色,拥有
BYPASSRLS,或拥有一行安全 表格为非FORCEd 启动失败RowSecurityBypassed名称 每个政策都承认每一行 对于它. - 健康检查,以启动器命名——
SELECT 1穿过生地 ,折叠入内核GET /healthz没有线./readyz不读它: 无法依赖每个复制股 立即全部删除. - 每个查询都交给
Observers,作为一个声明的中间软件,所以 编译observability()将失败写成行并otel()打开 长度和薄荷的仪器——没有旗和端口列表 满足当你没有作曲。 中间软件看到ORM道, SQL 建筑工和原始车道都一样 搭乘跑道latencyMs。 。 。 .
Results, 打开 @btravstack/prisma/result 子路径
Prisma 8 丢出一个 结构化 携带 PostgreSQL 自己的 SQLSTATE 出错 .
tryQuery 把它变成一个 Result 手持三只模范武器——
UniqueConstraintViolation (单位:千美元)23505,与 constraint 数据库
名称), ForeignKeyViolation (单位:千美元)23503和 NotAuthorized (单位:千美元)42501, (中文(简体) ),
包括拒绝写行安保政策)。 其他的都是缺陷,
除非你把它列入 raises - SQLSTATE 你自己的触发器是故意提高的
之后,作为一名 RaisedException 带着密码.
const saved = tryQuery(() => db.orm.orders.Order.create({ orderId })).mapErrCases(
(matcher, defect) =>
matcher
.with(P.tag("UniqueConstraintViolation"), () => duplicate(orderId))
.with(P.tag("ForeignKeyViolation"), P.tag("NotAuthorized"), (cause) => defect(cause)),
);
它需要一个 th克 而不是承诺: AsyncResult 渴望着,所以
在呼叫站点所构建的许诺在结果存在之前就已经开始了.
列级安全 @btravstack/prisma/rls 子路径
保险单在合同中公布 —— 说 @@rls 在模型和一个
policy_all 旁边有电线,规划者就发出 ENABLE ROW LEVEL SECURITY 财务报告和审定财务报表 CREATE POLICY 像其他迁移行动一样. 针是
交易:
const orders = await tenantPinned(db, tenant, (tx) => tx.orm.orders.Order.all());
为了连续的快照,通过 { isolationLevel: "repeatable read", readOnly: true }
作为第四个论点。 启动器在
租户针。 使用它的启动端客户端和回调 tx 每笔
相关读取;省略特性保存连接默认值. 见
连续的快照。 。 。 .
set_config(…, true) 实值 当地交易,这就是为什么这个打开一个
而不是交回被绑定的客户端:一个会话瞄准针只在同时有效
池子碰巧还原了同样的连接 并且没有第一个
时间没有。 政策必须读取 不变 设置 - app.tenant_id
仅仅是默认,因为 tenantPinned(db, tenant, work, { setting })
和一项政策 命名不同的一个 拒绝每行和每写, 它看起来
就像排安全工作一样.
两分之一保持部署, 和两者在被遗忘时都悄悄地失败: Prisma 8
作者政策,但没有 GRANTs,它会发出 ENABLE ROW LEVEL SECURITY 与
没办法说 FORCE -所以桌子是... -是的 - so the table's.. 拥有者,这是运行
移民,绕过一切政策。 连接为既不是所有者的角色
或超级用户——靴子拒绝使用 RowSecurityBypassed编辑
参考页
携带 DDL 和同样故障的较小行.
预定工作的租户发现情况
tenantListing 打开 /rls 宣布只使用租户身份查询(每页100个身份证,
在最后标识后恢复)和 a
检查 Prisma 迁移安装其功能、所有者政策和执行
赠款。 它在强制行级安全下工作 而普通应用
保留租户范围。 共享数据不需要特权
应用程序连接。 见
租户名单。 。 。 .
没有
正在迁移. 部署运行 prisma db migrate 根据同一数据库
进程开始前 ——,在行安全的地方,作为它的 拥有者
而不是角色 DATABASE_URL 携带。 自动迁移的应用程序
在靴子比赛 其他复制品.
引擎级追踪. 没有引擎: Prisma 8 是 TypeScript 运行时间 和船舶没有仪表包, 所以声明中间软件是 整个接缝,它已经承载了 运行时间的自身时间.
交易. 交界属于适配器,在呼叫时拼出——
db.transaction(fn) 这是原始的。 这个 rls 子路径打开一个交易
将一个设置 和它内部的工作是你的。 没有单位范围
交易,不会有一个
内核映射无。 。 。 .
库基类. 端口是您的应用程序的词汇, 而不是这个 包裹的.
选项
| 选项 | 何处 | 这是什么 |
|---|---|---|
name | prismaDatabase(name) | 港口的身份证和卫生检查的名称——要求 |
client | prismaDatabase(name)({ client }) | 从 URL 和中间软件中构建您的客户端 。 此软件包捆绑 - 需要 |
DATABASE_URL | 环境,读作 prismaDatabase(name) | 连接字符串 — 需要, 在图表构建中验证; 空白是一个错误, 退出 78 |
setting | tenantPinned(db, tenant, work, { setting }) | postgreSQL 运行时间设置策略为- 默认 app.tenant_id |
isolationLevel, (中文(简体) ), readOnly | tenantPinned(db, tenant, work, options) | 交易特性在 pin 之前建立—— 省略时的连接默认 |
raises | tryQuery(run, { raises }), (中文(简体) ), tenantPinned(…, { raises }) | SQLSTATEs 建模为 RaisedException 而不是缺陷——默认无 |
schema, (中文(简体) ), table, (中文(简体) ), tenantColumn | tenantListing(options) | 缩小列表的物理表和租户栏 |
name, (中文(简体) ), owner, (中文(简体) ), role | tenantListing(options) | 上市功能、其信任的拥有者和应用程序调用者 |
有一个 没有 instrumented 旗帜: 观察是设定的端口, 每一次呼叫都是
因此,一个图 拼凑,没有可观察 支付一个惰性呼叫,没有
端口列表. 完整表——默认,语义和推理——活在
参考页, (中文(简体) ),
这张名单是详细的.
许可证
麻省理工学院