@aws-blocks/bb-distributed-data

中文文档
0.3.0发布于 2026/11/02Apache-2.0TypeScriptES Module构建来源已验证近 30 天下载 6.3万

无服务器SQL数据库由亚马逊·奥罗拉DSQL支持. 0-ops,即时提供,规模为零,可选的多区域活性写作.

中文使用文档
文档目录13 节
  1. 快速启动
  2. 交易(货币管制)
  3. 移徙
  4. 邮递SQL 兼容性
  5. 交易限制
  6. Kysely 查询构建器
  7. 处理错误
  8. 测试 OCC 冲突
  9. 它的规定
  10. 地方发展
  11. 配置
  12. 软件包导出条件
  13. 与数据库的差异(奥罗拉)

@aws- blocks/ bb- 分布数据

无服务器SQL数据库由亚马逊·奥罗拉DSQL支持. 0-ops,即时提供,规模为零,可选的多区域活性写作.

何时使用 : 无服务器应用程序需要缩放,不需要操作管理,零闲成本要求的工作量,多区域活性写作,或者不需要行级安全,触发,程序,或PL/pgSQL功能的任何SQL应用程序.

不使用时 : 如果需要行级安全,触发器,程序,或PL/pgSQL函数——使用 Database (奥罗拉语). Aurora DSQL支持SQL语言功能. 如果您需要交易, 且交易不能在争议中失败 Database如果连接到Supabase——使用 Database 与 fromExisting()。 。 。 .

设计与模拟等价细节 : 设计

快速启动

import { DistributedDatabase, sql } from '@aws-blocks/bb-distributed-data';

const db = new DistributedDatabase(scope, 'main', {
  migrationsPath: './aws-blocks/dsql-migrations',
});

// Same query API as Database — parameterized via sql tagged template
const users = await db.query<{ id: string; name: string }>(
  sql`SELECT * FROM users WHERE active = ${true}`
);

const user = await db.queryOne<{ id: string; name: string }>(
  sql`SELECT * FROM users WHERE id = ${userId}`
);

const { rowCount } = await db.execute(
  sql`INSERT INTO users (id, name, email) VALUES (${id}, ${name}, ${email})`
);

交易(货币管制)

DSQL使用OCC——如果另一笔交易修改了同一行,交易可能会失败. 回调执行一次, 除非你选择重试 .

// Default: no retry. Throws SerializationFailureException (HTTP 409 Conflict, retriable) on conflict.
await db.transaction(async (tx) => {
  await tx.execute(sql`UPDATE accounts SET balance = balance - ${100} WHERE id = ${fromId}`);
  await tx.execute(sql`UPDATE accounts SET balance = balance + ${100} WHERE id = ${toId}`);
});

// Opt-in retry: callback may execute multiple times.
// ⚠️ Do NOT include external side effects (HTTP calls, emails) inside.
await db.transaction(async (tx) => {
  await tx.execute(sql`UPDATE accounts SET balance = balance - ${100} WHERE id = ${fromId}`);
  await tx.execute(sql`UPDATE accounts SET balance = balance + ${100} WHERE id = ${toId}`);
}, { retryOnConflict: true, maxRetries: 3 });

第二个论点 transaction() 接受:

interface TransactionOptions {
  /** Retry on OCC conflict. Callback may execute multiple times. @default false */
  retryOnConflict?: boolean;
  /** Max retry attempts. Only applies when retryOnConflict is true. @default 3 */
  maxRetries?: number;
}

移徙

每个文件有一个DDL语句. DML在不同的文件中。 这符合DSQL的交易限制.

aws-blocks/dsql-migrations/
  001_create_users.sql       ← single DDL
  002_create_posts.sql       ← single DDL
  003_create_index.sql       ← single DDL (CREATE INDEX ASYNC)
  004_seed_admin.sql         ← DML only
-- 001_create_users.sql
CREATE TABLE users (
  id TEXT PRIMARY KEY DEFAULT gen_random_uuid(),
  email TEXT UNIQUE NOT NULL,
  name TEXT NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 003_create_index.sql
CREATE INDEX ASYNC idx_users_email ON users(email);

移民情况得到检查 dsql-lint 在合成时间.

设定 migrationsPath 与工程根相对的路径 (例如:. './aws-blocks/dsql-migrations'); 由您运行的目录合成解析 cdk 编号 : npm run deploy 进来 这是最简单的可靠模式.

你用不着 fileURLToPath(import.meta.url) 为了这个 您的后端模块在当地作为无害环境管理运行,但捆绑到 常见JS 在兰布达,在那里 import.meta 为空。 AWS 屏蔽闪烁 import.meta.url 编号 : import.meta.dirname {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}所以它不会在装货时坠毁 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}但是在运行时 捆绑输出 位置,而不是您的源树。 所以别用 import.meta.url 在请求的时间读取与您来源相关的文件; 输入数据或将其作为Lambda资产.

邮递SQL 兼容性

Aurora DSQL是 PostgreSQL 有线-protocol相容的. SQL 特性兼容性不同于 PostgreSQL; 见 Aurora DSQL SQL 兼容文档 详细情况.

未支持备选案文
行级安全在应用程序代码中过滤条款的位置
触发器事件驱动逻辑(Event Bridge、Lambda)
程序LANGUAGE SQL 函数或应用程序逻辑
PL/pgSQL 函数LANGUAGE SQL 函数或应用程序逻辑
职位/职位BIGINT GENERATED BY DEFAULT AS IDENTITY (CACHE 1) 或 UUID (% 1) (gen_random_uuid()(三); CACHE 用于身份栏和序列,必须是 1 或者说 >= 65536
特伦特DELETE FROM
临时表格CTEs 或子电池
听/通知AppSync事件、事件桥或民意调查
扩展不详
ADD COLUMN 与国防在不默认情况下添加列, 回填已存在的行, 然后使用 ALTER COLUMN ... SET DEFAULT
索引密钥排序方向( E)ASC编号 :DESC(中文(简体) )关闭它; 执行命令 ORDER BY 查询(NULLS FIRST/LAST 已支持)

交易限制

约束限制
货币模型OCC(可能发生冲突)
隔离级别固定: 可重复读取
每个交易的最大行变异3 000个
每笔交易的最大数据10个小米B
最大交易期限5分钟
每笔交易的DDL1个最大语句
DDL + DML 混合不允许

Kysely 查询构建器

import { createKyselyAdapter } from '@aws-blocks/bb-distributed-data';

interface Schema {
  users: { id: string; email: string; name: string };
}

const kysely = createKyselyAdapter<Schema>(db);

const users = await kysely
  .selectFrom('users')
  .where('email', '=', '[email protected]')
  .selectAll()
  .execute();

别用Kysely的 .addForeignKeyConstraint() - 它会在DSQL上失败.

处理错误

import { DistributedDatabaseErrors } from '@aws-blocks/bb-distributed-data';
import { isBlocksError } from '@aws-blocks/core';

try {
  await db.transaction(async (tx) => { /* ... */ });
} catch (e: unknown) {
  if (isBlocksError(e, DistributedDatabaseErrors.SerializationFailure)) {
    // OCC conflict — transaction was NOT committed. Serialized as HTTP 409
    // (Conflict), retriable — safe to retry.
  }
  if (isBlocksError(e, DistributedDatabaseErrors.UniqueConstraintViolation)) {
    // Duplicate key — serialized as HTTP 409 (Conflict), not retriable
    // (a blind retry of the same insert fails identically).
  }
  if (isBlocksError(e, DistributedDatabaseErrors.QueryFailed)) {
    // General query failure
  }
  if (isBlocksError(e, DistributedDatabaseErrors.TransactionRowLimitExceeded)) {
    // More than 3,000 rows mutated in one transaction
  }
  if (isBlocksError(e, DistributedDatabaseErrors.ConnectionFailed)) {
    // Cannot reach the DSQL cluster
  }
  if (isBlocksError(e, DistributedDatabaseErrors.TransactionFailed)) {
    // Transaction could not commit (general failure distinct from serialization/row-limit)
  }
}

测试 OCC 冲突

模型提供了 simulateConflict() 单位测试的助手。 它只与本地的嘲弄相悖: 部署 AWS 运行时间 cdk synth 它抛出通常的合成时错误.

db.simulateConflict(); // next commit will fail with SerializationFailureException

await expect(db.transaction(fn)).rejects.toThrow('SerializationFailureException');
db.simulateConflict(); // first attempt fails, second succeeds
const result = await db.transaction(fn, { retryOnConflict: true });

它的规定

  • 奥罗拉DSQL集群 ——无服务器,不需要VPC,公开端点
  • 移徙Lambda —运行 .sql 关于通过自定义资源进行再试部署的文件
  • 行政会议 —— 说 dsql:DbConnect (app Lambda,仅限DML), dsql:DbConnectAdmin (移民兰布达,DDL)
  • 环境变量 —— 说 BLOCKS_{name}_ENDPOINT, (中文(简体) ), BLOCKS_{name}_REGION

没有VPC,没有秘密,没有安全小组,没有代理. DSQL使用 IAM 令牌认证.

地方发展

  • 引擎 : PGlite (WASM PostgreSQL) 由 DSQL 兼容层所包裹
  • 存储 : .bb-data/{fullId}/ ——在重启期间坚持不懈
  • 验证 : dsql-lint 在 PGlite 执行前检查 SQL
  • 交易跟踪 : DDL/DML混合和3 000行限制在当地执行

迁移 SQL 还检查过 dsql-lint 在CDK合成时,在捆绑用于部署之前.

配置

interface DistributedDatabaseOptions {
  /** Path to directory containing numbered .sql migration files. */
  migrationsPath?: string;
  /** Removal policy. @default 'retain' */
  removalPolicy?: 'destroy' | 'retain';
  /** Optional logger for internal operations. When omitted, a default Logger at error level is created. */
  logger?: ChildLogger;
}

软件包导出条件

{
  "exports": {
    ".": {
      "cdk": "./dist/index.cdk.js",
      "aws-runtime": "./dist/index.aws.js",
      "default": "./dist/index.mock.js"
    }
  }
}

与数据库的差异(奥罗拉)

侧面Database (bb-data) (英语)DistributedDatabase (bb-分布数据)
发动机Aurora 无服务器 v2(数据 API)奥罗拉 DSQL (pg + IAM)
PostgreSQL 兼容性满电线协议兼容; 见 SQL 兼容性细节
交易悲观主义(准确的一)OCC(可能发生冲突)
withRLS()✅❌
fromExisting()✅❌
crud()✅❌
外国密钥✅✅
多国❌积极活动
要求对没有
部署时间~10分钟秒数
闲置费用0美元(0 ACU)0美元 (单位:美元)

版本与发布记录

@aws-blocks/bb-distributed-data 共发布 15 个版本,首次发布于 2026/06/16;过去 12 个月发布了 15 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.3.0latest2026/11/025 天前
0.2.22026/10/1622 天前
0.0.0-canary.esql-canary.c93c81b.1791235863canary-esql-canary2026/10/061 个月前
0.2.12026/10/051 个月前
0.0.0-canary.esql-canary.f7f39ac.17909891272026/10/031 个月前
0.0.0-canary.ci-publish-canary-npm.f53dfdc.1790988617canary-ci-publish-canary-npm2026/10/031 个月前

关于 @aws-blocks/bb-distributed-data 的常见问题

@aws-blocks/bb-distributed-data 是什么?

无服务器SQL数据库由亚马逊·奥罗拉DSQL支持. 0-ops,即时提供,规模为零,可选的多区域活性写作.

如何安装 @aws-blocks/bb-distributed-data?

在项目目录运行 npm install @aws-blocks/bb-distributed-data,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:kysely(>=0.28.12 <0.30.0)、constructs(^10.6.0)、aws-cdk-lib(>=2.100.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@aws-blocks/bb-distributed-data 支持 TypeScript 吗?

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

@aws-blocks/bb-distributed-data 支持 ESM 还是 CommonJS?

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

@aws-blocks/bb-distributed-data 可以商用吗?

@aws-blocks/bb-distributed-data 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@aws-blocks/bb-distributed-data 的下载量有多少?

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

@aws-blocks/bb-distributed-data 还在维护吗?

最新版本 0.3.0 发布于 2026/11/02(5 天前);至今共发布 15 个版本,其中过去 12 个月发布了 15 个;首次发布于 2026/06/16。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。