• 耐德布
Cloudflare 持久对象 SQLite 的真正限制, 编码而不是文件
A 类 ctx.storage.sql 主机和一个编码平台实际工作的值编码器,不是
什么SQLite文档. ctx.storage.sql 在100个绑定参数上加盖语句
本地 PDO 允许 32,766, 拒绝 LIKE 模式超过50字节,有 无命名参数
完全没有上方的整数 2^53 (英语) 输了 每一个都是有分寸的拒绝
从一个已部署的物体,每个物体都有一个缺陷,一个地方的SQLite通过.
目录
为什么
一个持久对象的SQLite是一个真正的好家 一个小数据库:非常一致, 在与代码相同的隔离中,同步读取如此屏蔽的呼叫者与代码相组成. 然后,你以为自己是SQLite,而它否认SQLite所没有的东西.
拒绝书没有作为成套文件记录,不能作为金枪鱼,而且每份都未能完成 不同的寄存器: 参数封顶所抛出的错误, a 悄悄地打错了电话 (单位:千美元) 宽整数。 返回错误而不是出错的值,除了正确之外,不能告诉 输出直到以后很久.
因此极限活在代码中,作为被命名的常数和被命名的拒绝,每个极限有一个测试.
QQ 安装
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没有单词 |
双方可代表的任何东西都没有被包裹,所以常见的路径一无所获.
桥梁合同
两个切入点,第二个是有趣的.
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 |
测试
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 | 消费者:Cloudflare工人上的Drupal 11 |
drupflare/rom | composer require drupflare/rom:0.*坐在顶端的德鲁帕尔11号司机 |
drupflare/cartridge | 后退门并中断此包的导入 |
许可证
MIT (c) 格雷戈里·米切尔 2026. 见 自由主义。 。 。 .