# @drupflare/durabledb 中文文档

规范地址：https://npmcn.com/package/%40drupflare/durabledb/

版本：0\.1\.4
npm 元数据更新时间：2026-09-30T19:07:38.118Z
中文译文更新时间：2026-11-14T07:49:10.944Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40drupflare/durabledb
原文对照：https://npmcn.com/package/%40drupflare/durabledb/?lang=original
项目主页：https://github.com/drupflare/durabledb
源码仓库：https://github.com/drupflare/durabledb

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：42.8 kB，6 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：1 个
- 首次发布：2026-08-14T05:36:22.363Z
- 最新版本发布：2026-09-30T19:07:37.742Z
- 近 30 天下载量：2124（2026-10-13 至 2026-11-11，npm 官方下载统计）
- 已发布版本数：5（近 12 个月 5 个）

## 中文简介

一个编码 Cloudflare 持久对象 SQLite 真实平台限制的编码器: 100 个绑定参数,一个50字节的类似图案,和2^53以上的丢失整数.

## 安装

```sh
npm install @drupflare/durabledb
```

也可以使用：`pnpm add @drupflare/durabledb`、`yarn add @drupflare/durabledb`、`bun add @drupflare/durabledb`

## README

# • 耐德布

> Cloudflare 持久对象 SQLite 的真正限制, 编码而不是文件

[![Build](https://github.com/drupflare/durabledb/actions/workflows/build.yml/badge.svg)](https://github.com/drupflare/durabledb/actions/workflows/build.yml) [![Prettier](https://github.com/drupflare/durabledb/actions/workflows/prettier.yml/badge.svg)](https://github.com/drupflare/durabledb/actions/workflows/prettier.yml) [![codecov](https://codecov.io/gh/drupflare/durabledb/branch/master/graph/badge.svg)](https://codecov.io/gh/drupflare/durabledb) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://npmcn.com/package/%40drupflare/durabledb/LICENSE)

**A 类 `ctx.storage.sql` 主机和一个编码平台实际工作的值编码器,不是 什么SQLite文档.** `ctx.storage.sql` 在100个绑定参数上加盖语句 本地 PDO 允许 32,766, 拒绝 `LIKE` 模式超过50字节,有 **无命名参数 完全没有**上方的整数 **2^53 (英语)** 输了 每一个都是有分寸的拒绝 从一个已部署的物体,每个物体都有一个缺陷,一个地方的SQLite通过.

* * *

## 目录

-   [为什么](https://npmcn.com/package/%40drupflare/durabledb/#readme--why)
-   [安装](https://npmcn.com/package/%40drupflare/durabledb/#readme--install)
-   [限制](https://npmcn.com/package/%40drupflare/durabledb/#readme--limits)
-   [代码c](https://npmcn.com/package/%40drupflare/durabledb/#readme--codec)
-   [桥梁合同](https://npmcn.com/package/%40drupflare/durabledb/#readme--bridge-contract)
-   [API 密码](https://npmcn.com/package/%40drupflare/durabledb/#readme--api)
-   [测试](https://npmcn.com/package/%40drupflare/durabledb/#readme--testing)
-   [相关仓库](https://npmcn.com/package/%40drupflare/durabledb/#readme--related-repositories)
-   [许可证](https://npmcn.com/package/%40drupflare/durabledb/#readme--license)

* * *

## 为什么

一个持久对象的SQLite是一个真正的好家 一个小数据库:非常一致, 在与代码相同的隔离中,同步读取如此屏蔽的呼叫者与代码相组成. 然后,你以为自己是SQLite,而它否认SQLite所没有的东西.

拒绝书没有作为成套文件记录,不能作为金枪鱼,而且每份都未能完成 不同的寄存器: 参数封顶所抛出的错误, a **悄悄地打错了电话** (单位:千美元) 宽整数。 返回错误而不是出错的值,除了正确之外,不能告诉 输出直到以后很久.

因此极限活在代码中,作为被命名的常数和被命名的拒绝,每个极限有一个测试.

* * *

## QQ 安装

```sh
bun add @drupflare/durabledb
```

3个切入点,拆分不是化妆品:

| 导入 | 给你 | 需求 `@drupflare/cartridge` |
| --- | --- | --- |
| `@drupflare/durabledb` | 下面的一切 | **对** |
| `@drupflare/durabledb/codec` | `encode`, (中文(简体) ), `decode`, (中文(简体) ), `codecGuard`, (中文(简体) ), `PHP_CODEC` | 没有 |
| `@drupflare/durabledb/do-sqlite` | `SiteDurableObject`, (中文(简体) ), `toPositional`, (中文(简体) ), `bindable` | **对** |

`src/do-sqlite.ts` 进口 `@drupflare/cartridge/gate` 财务报告和审定财务报表 `/mask`· ; `src/codec.ts` 无输入 所有,所以消费者只需要 代码支付不依赖。 没有深入的输入: `exports` 地图是整个地表,和 `@drupflare/durabledb/src/codec.ts` 被拒绝 解决者.

* * *

## 限制

每个都打破了真实的东西。 没有一个是保守的猜测.

| 限制 | 数值 | 东西坏了 |
| --- | --- | --- |
| 每个声明的约束参数 | **100个** | 缓存写入路径; 冷 `cache_discovery` 需要设置 574个 |
| `LIKE` 编号 : `GLOB` 模式长度 | **50 字节** | 绑定 **简单 `LIKE`**,不仅 `GLOB`因此,它是隐形 对于一个打电话者 |
| 每个记录的字节数 | **2,199,995人次 (中文(简体) )** | 堆积快照行 |
| 语句文本 | **100 000个字符** | a 块 DDL 重放 |
| 整数读取 | **2^53以上的损失** | 写 `9007199254740993`读回 `9007199254740992` |
| 已命名参数 | **无** | 每个 Drupal 查询; `toPositional()` 转换它们 |

有两个后果是:

**写出宽整数是准确的;读取一是不准确的.** `ctx.storage.sql` 输入栏 所以准确性在消费者看到之前就消失了. `CAST(col AS TEXT)` 返回每个数字,所以存储是好的;损失在光标中. `UnreadableIntegerError` 以作出拒绝而不是错误的回答.

**"没有比一行还小的单位"是假的**而这是这个项目的 未经证实 暂时相信 3个520KB行,每行翻过记录盖,然后看 不可分割; SQLite 用 `col = col || ?`。 。 。 .

> \[尖叫声\] **永远不要扩大限制 因为测试通过.** 这些来自一个部署的物体 和一个本地的 SQLite会欣然接受他们全部. 如果你认为错了, 重新测量部署 工人们说。 不要放松警卫.

* * *

## • 编码c

消费者运行时间是 **32 位数** PHP 原站点构建 (`PHP_INT_SIZE` 4),因此,任何联署材料号码在 2^31以上在入场途中静静地包裹. 测量: `Date.now()` 到达 PHP 时 `-397708726` 而不是~1.78e12。 分别发现了两个实例,一个时间戳和一个节点 id, 和找到两个单独 意味着该类仍然开放.

显而易见的修补, 串起任何不安全的东西, **在另一个方向是损失.** PHP 接收 `"1780000000000"` 并且无法分辨它是大到无法表示的整数还是 真字符串; 发送后生成数字所属的字符串和腐败 晚点再来一次.

所以不能在本土交叉的值被包裹在一个有标记的信封里而不是被平分 `decode()` 确切的反向为 `encode()`数字 :

| 信封 | 卡莉丝 |
| --- | --- |
| `{__t: 'i', v: '1780000000000'}` | 32 位区域外的整数 |
| `{__t: 'n', v: '1.5e300'}` | 非无限或精确的浮动 |
| `{__t: 'd', v: '1780000000000'}` | `Date` |
| `{__t: 'b', v: '<base64>'}` | 字节 |
| `{__t: 'u'}` | `undefined`,PHP没有单词 |

双方可代表的任何东西都没有被包裹,所以常见的路径一无所获.

* * *

## 桥梁合同

两个切入点,第二个是有趣的.

```ts
execSql(sql: string, params?: SqlBindings): ExecSqlResult
execTxn(req: TxnRequest): ExecTxnResult
```

`execTxn` 运行一个内部的语句列表 `ctx.storage.transactionSync()`,可选择使用 读取. `commit: false` 运行它们,评估同一交易内的读取,然后 扔出一个私人哨兵 所以运行时间卷回,和 **仍然返回结果**,哪个 是使推测行数和插入id成为可能的原因.

`ExecTxnResult` 是一种受歧视的结合,而不是一种带有选择性的形态:a 失败的回放已被回滚, 因此没有结果可以读取, 而 歧视是阻止打电话的人读这些东西的原因.

* * *

## • API

| 导出 | 这是什么 |
| --- | --- |
| `SiteDurableObject` | 持久对象; `execSql`, (中文(简体) ), `execTxn`, (中文(简体) ), `installBridge`, (中文(简体) ), `nowMs` |
| `encode` 编号 : `decode` | 解码器,准确反相 |
| `codecGuard(host)` | 将主机表面包起来, 这样每个值都会被编码 |
| `PHP_CODEC` | 作为源代码的 PHP 半导体, 用于评价它的主机 |
| `toPositional(sql, params)` | 重写命名参数, 因为引擎没有 |
| `bindable(value)` | 一个值转换 `sql.exec()` 需求;联合来文 `BigInt` 被拒绝 |
| `UnreadableIntegerError` | a 见上文2^53,拒绝而不是错误回答 |
| `ExecSqlResult` | `{ rows, rowsRead, rowsWritten, lastInsertRowid, changes }` |
| `TxnRequest` 编号 : `TxnStatement` 编号 : `ExecTxnResult` | 上面的重播合同 |
| `SqlBindings` | `unknown[] | Record<string, unknown> | null` |

* * *

## 测试

```sh
bun run typecheck
bun run test # 87 assertions across 3 specs
bun run test:coverage
```

**87次通过,0次失败**,按计量 **61.68%的报表** (单位:千美元)`codec.ts` 82.29%, `do-sqlite.ts` 49.69%:持久物体路线和 `alarm()` 需要一个真实的 `ctx.storage.sql`故他们被覆盖 在消费者而不是在这里)。 车道开入 **节点**,而不是工人,和覆盖用途 `provider: 'v8'` 而不是说 `istanbul`。兄弟会的寄存器完全在同一轴上分裂:工人专用道必须使用 listanbul, 因为 v8 提供者从节点检查器读取覆盖, 属性为 0 隔离区内部;一个节点道使用v8.

套房建立在两个规则之上:

-   **解码器必须绕行.** 能解码它无法编码的类型 的编码器是需要修复的bug, 不是一个跳过测试.
-   **失败的是拒绝而不是截取.** 无法默默切出值 除了正确的输出,直到以后很久.

* * *

## 有关仓库

| 仓库 | 这是什么 |
| --- | --- |
| [`drupflare/worker`](https://github.com/drupflare/worker) | 消费者:Cloudflare工人上的Drupal 11 |
| [`drupflare/rom`](https://github.com/drupflare/rom) | `composer require drupflare/rom:0.*`坐在顶端的德鲁帕尔11号司机 |
| [`drupflare/cartridge`](https://github.com/drupflare/cartridge) | 后退门并中断此包的导入 |

* * *

## 许可证

MIT (c) 格雷戈里·米切尔 2026. 见 [自由主义](https://npmcn.com/package/%40drupflare/durabledb/LICENSE)。 。 。 .

## 常见问题

### @drupflare/durabledb 是什么？

一个编码 Cloudflare 持久对象 SQLite 真实平台限制的编码器: 100 个绑定参数,一个50字节的类似图案,和2^53以上的丢失整数\.

### 如何安装 @drupflare/durabledb？

在项目目录运行 npm install @drupflare/durabledb，或使用 pnpm add / yarn add / bun add。

### @drupflare/durabledb 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @drupflare/durabledb 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @drupflare/durabledb 可以商用吗？

@drupflare/durabledb 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @drupflare/durabledb 的下载量有多少？

根据 npm 官方下载统计，@drupflare/durabledb 在 2026/10/13 – 2026/11/11 这 30 天内被下载 2,124 次，日均约 71 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @drupflare/durabledb 还在维护吗？

最新版本 0\.1\.4 发布于 2026/10/01（1 个月前）；至今共发布 5 个版本，其中过去 12 个月发布了 5 个；首次发布于 2026/08/14。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

