mcpField
A
atscript-db

atscript-db

github.com/moostjs数据与数据库146 次安装1 周前更新
代码仓库

关于 atscript-db

atscript-db 是供 TypeScript 项目使用的数据库层技能,涵盖多种数据库适配器、模式同步和关系处理。它适合构建数据库读写及 Moost HTTP 接口的开发者。

主要功能

  1. 01多数据库适配器
  2. 02模式同步与分布式锁
  3. 03统一筛选和写入接口
  4. 04关系导航与嵌套写入控制
  5. 05Moost HTTP 控制器

适用场景

  1. 01在 SQLite、PostgreSQL、MySQL 或 MongoDB 上访问数据
  2. 02同步应用模型与数据库模式
  3. 03为数据库表提供 Moost HTTP 接口

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/moostjs/atscript-db --skill atscript-db

安装后在 Claude Code 中输入/atscript-db确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
actions.md
adapters-memory.md
adapters-mongo.md
adapters-mysql.md
adapters-postgres.md
adapters-sqlite.md
annotations.md
creating-adapters.md
crud.md
db-client.md
encryption.md
geo-search.md
getting-started.md
http-query-syntax.md
mongo-annotations.md
moost-db.md
patch.md
queries.md
relations.md
schema-sync.md
tables-and-views.md
testing.md
validation.md
versioning.md

详细介绍

atscript-db

Install

npx skills add moostjs/atscript-db     # this skill (DB layer)
npx skills add moostjs/atscript        # sibling — .as syntax, @meta.*, @expect.*, asc, unplugin

Packages

@atscript/db                     core: DbSpace, AtscriptDbTable, AtscriptDbView, schema sync, relations
    ├── @atscript/db-sql-tools   shared SQL builders (WHERE, SELECT, INSERT, aggregation, filter visitor)
    │       ├── @atscript/db-sqlite     better-sqlite3 + FTS5 + sqlite-vec (vec0) + collation
    │       ├── @atscript/db-postgres   pg + pgvector + HNSW + CITEXT + FTS
    │       └── @atscript/db-mysql      mysql2 + VECTOR + FULLTEXT + utf8mb4
    ├── @atscript/db-mongo       mongodb (aggregation pipelines, Atlas Search, no SQL layer)
    ├── @atscript/db-memory      in-memory adapter (no engine); provider-backed read-only + stored read-write
    ├── @atscript/moost-db       Moost HTTP controllers: AsDbController / AsDbReadableController
    └── @atscript/db-client      browser/SSR fetch client over moost-db REST
pnpm add @atscript/core @atscript/typescript @atscript/db
pnpm add @atscript/db-sqlite better-sqlite3                 # pick one adapter
pnpm add @atscript/db-postgres pg
pnpm add @atscript/db-mysql mysql2
pnpm add @atscript/db-mongo mongodb
pnpm add @atscript/db-memory                                 # in-memory (tests / runtime surfaces)
pnpm add @atscript/moost-db @moostjs/event-http moost       # REST
pnpm add @atscript/db-client                                 # browser/SSR client

Quick start

// src/todo.as
@db.table 'todos'
@db.depth.limit 0
export interface Todo {
    @meta.id @db.default.increment
    id: number
    title: string
    @db.default 'false'
    completed?: boolean
    @db.default.now
    createdAt?: number.timestamp
}
import { DbSpace } from "@atscript/db";
import { syncSchema } from "@atscript/db/sync";
import { SqliteAdapter, BetterSqlite3Driver } from "@atscript/db-sqlite";
import { Todo } from "./todo.as";

const db = new DbSpace(() => new SqliteAdapter(new BetterSqlite3Driver("./app.db")));
await syncSchema(db, [Todo]); // idempotent, lock-coordinated
const todos = db.getTable(Todo);

await todos.insertOne({ title: "ship it" }); // { insertedId: 1 }
const open = await todos.findMany({ filter: { completed: false } });
await todos.updateOne({ id: 1, completed: true }); // PK required in payload
await todos.deleteOne(1);

Invariants

#规则
1适配器保持一致 — 应用代码不得根据适配器类型分支。每个适配器都接受相同的筛选器形状、补丁形状和控制项;特定引擎的功能通过注解提供,而不是通过不同的 API 分支提供。
2@meta.id 是复合键标记。 不使用 @meta.isKey。不同属性上的多个 @meta.id 会组成复合主键。不接受参数。
3@db.depth.limit N 用于限制沿 @db.rel.from / @db.rel.via 链进行的嵌套写入(插入/替换/补丁)。 未设置或为 0 → 服务会以 HTTP 400 拒绝嵌套的 FROM/VIA 负载,并且 /meta 会提供浅层外键引用。设置 N ≥ 1 以启用。@db.rel.to(单个父级引用)不受此限制。
4MongoDB 索引使用 atscript__ 前缀。 syncIndexes() 只管理带此前缀的索引;使用者创建且以 atscript__ 开头的索引会被视为托管索引,发生漂移时可能被删除。
5使用项目中生成的 *.as.d.ts / atscript.d.ts 文件由 asc 生成。 切勿手动编辑。通过 npx asc 重新生成(或让 unplugin-atscript 在打包时生成)。
6架构同步会获取分布式锁。 多 Pod 部署必须在 syncSchema() 选项中配置 podId、lockTtlMs、waitTimeoutMs;控制表为 __atscript_control。
7第三方 BaseDbAdapter 实现不得导入任何其他项目内适配器。 共享 SQL 辅助工具位于 @atscript/db-sql-tools。各适配器彼此独立。
8导航关系采用惰性加载。 读取时,除非通过 controls.$with 请求,否则 @db.rel.to / .from / .via 字段均为 undefined。不会进行 N+1 惰性加载。
9@db.column 会产生逐行开销——没有充分理由时不要使用。 使用一次,就会让整张表在每次读取/写入/筛选时都走键名转换路径。只有以下情况才算合理:(a) 目标名称是 SQL 保留字;(b) 需要集成不归你所有的架构;(c) 仓库范围内的约定要求数据库使用 snake_case,而 TS 使用 camelCase。@db.table 'physical' 的用法理念也相同(没有逐行开销)。详情和不适用的理由 → annotations.md § @db.column — 何时使用。
10读取响应始终包含 preferredId 字段。 moost-db 控制器会静默扩展 $select,在每个返回行的读取端点(/query、/pages、/one、/one/:id、search/vector)中包含 meta.preferredId。聚合($groupBy)和计数($count)响应不会扩展。transformProjection() 覆盖项无法抑制 preferred-id 字段——应在网络/授权层隐藏标识符。
11操作请求体使用封装对象 { ids?, input? }。 ids 携带标识符:对于 @DbActionID* / @DbActionRow*,使用 JSON 对象(单个)或对象数组(多个),绝不能使用标量;字段集合必须与某个有效标识方式(主键或任一 @db.index.unique 组)完全匹配,且严格校验——拒绝未知字段。input 携带可选的 @InputForm 负载,并会在处理器触发前根据声明或推断的表单在服务端进行校验(ValidatorError → 结构化的 400;缺少 input 时按 {} 校验,因此必填字段会导致 400,且处理器始终会收到一个对象)。单字段主键应发送 { "ids": { "id": "abc" } },绝不能只发送 "abc"。根值为数组或标量 → 400。对于没有表单的表级操作,空请求体/{} 有效。
12disabled 必须配合 requiredFields 使用。 @DbAction / @DbActions* 谓词必须将其读取的每个字段声明为字面量 requiredFields 元组。该元组会将谓词的行参数类型收窄为 Pick<FlatOf<TRow>, R[number]>[],并驱动 @DbActionRow* 注入及 $actions=true 扩展的服务端投影扩展。requiredFields 仅供服务端内部使用——绝不会出现在 /meta 网络数据中。disabled 未配合 requiredFields 使用 → 发现时会丢弃该操作。
13每行操作的可用性由服务端通过 ?$actions=true 评估。 /query、/pages、/one 上的可选 URL 控制项。每个返回行都会获得 $actions: string[](未禁用的行级/多行级操作名称)。在 $count / $groupBy 响应中会剥离。'table' 级操作不会出现。通过每个请求的 applyMetaOverlay() 进行筛选。
14/meta.fields 是精确的——它就是判断门槛(自 0.1.128 起)。 对每个适配器、模式和字段类型,fields[P].sortable === ($sort=P accepted) 且 fields[P].filterable === (filter on P accepted);两者都来自同一个 FieldCapabilityIndex。indexed: true 是独立的提示信息(显式 @db.index*、主键、唯一索引)——自动模式会公布每个适配器支持排序的列。适配器能力优先于注解:任何适配器都不支持对 @db.json / 数组列排序(canSortField 会否决 designType 为 'json' / 'array' 的字段,因此 Mongo/memory 上 $sort=tags 也会返回 400),SQL 上也不支持对它们筛选。未列出的字段一律返回 400:嵌套对象的父字段(contact——请使用叶子字段)、导航路径(assignee.name——请使用 $with=assignee(...))、SQL 上的 JSON 后代字段(prefs.theme——请查询父字段;Mongo/memory 会列出并接受这些字段)、未知字段。手动模式策略仅涵盖筛选和$sort;$groupBy/$having/聚合字段使用物理能力。拒绝响应:{ statusCode: 400, message, errors: [{ path, message }] }。所有地方都拒绝物理列名(contact\_\_email),包括 transformFilter覆盖项以及updateMany/deleteMany。详情 → moost-db.md § 门槛模式。
15按模型令牌绑定控制器;在 init() 前注册空间。 @TableController(Model) 会在 app.init() 时根据当前注册表延迟解析——必须先调用 provideDbSpace(db)(以及通过 provideDbSpace(x, "name") 注册与 @db.space 匹配的命名空间)。惰性工厂形式需要显式前缀。自带构造函数的子类应调用 super(moost),基类会根据类元数据进行解析(构造函数签名为 (app, readable?)——readable 位于最后且可选)。实例形式(@TableController(table))仍然可用,但会使绑定依赖于模块求值顺序。→ moost-db.md § 绑定形式
16默认情况下,同步失败会明确报告。 syncSchema 运行时若有条目出错,即使使用默认的 NoopLogger,也会通过控制台回退机制报告摘要和每个条目的错误;可通过 onError: "throw" | "warn" | "silent" 调整行为。应从生成的清单提供同步数据(dbPlugin({ manifest }) → atscriptModels),不要使用手工维护的导入数组。→ schema-sync.md
17.as 产物必须按值导入——绝不能使用 import type。 编译后的 .as 模型/表单是运行时会用到的类(装饰器参数、按参数类型进行的 DI、.validator()、清单数组)。仅导入类型会移除值,而 design:paramtypes 会输出 Object——表单绑定和按类型进行的 DI 会静默失效。导入 .as 文件的应用应关闭 typescript/consistent-type-imports 风格的 lint 规则(create-moost 预设已将其禁用)。
18guardWrite / guardRemove 是表的写入守卫(自 0.1.128 起)。 onWrite / onRemove 会在任何事务之外看到不可信请求体;覆盖的守卫会作为表调用的 guard 选项传入,并在表自身的事务内部、默认值应用和校验之后运行一次(运行后会重新校验各行);404/409 的区分会在表调用之后进行。没有 transactionalWrites 标志——覆盖守卫就是启用开关。SDK 调用方可通过 insertMany(rows, { guard }) / deleteOne(id, { guard }) 使用相同的钩子。拒绝请求时应抛出 HttpError;绝不要吞掉 DbError(PG 事务会中止);绝不要在 SQLite 上等待外部 I/O。内置写入失败会抛出 HttpError;非对象请求体会在任何钩子运行前触发 400 形状门槛错误;onWrite 返回非对象会导致 500。参见 references/moost-db.md、references/crud.md。
19仅包含主键的 CAS 写入是真正的写入(自 0.1.128 起)。 updateOne({ ...pk, $cas }) / PATCH { id, version } 会执行 SET version = version + 1 WHERE pk AND version = ?——匹配时递增并报告 { 1, 1 },过期/缺失时报告 { 0, 0 }(HTTP 409/404)。没有 $cas 时,空补丁不会写入任何内容,并会如实报告存在性计数;返回 undefined / {} 的 withOptimisticRetry 修改器明确表示不写入。绝不要用未更改的表单及其 version 再次提交。参见 references/versioning.md。批量栅栏:touchMany(keys, { require })(自 0.1.129 起)——每个键使用主键(可为复合键,绝不能是唯一索引)和版本号,不带负载;过期/缺失时返回 CasMismatchError(DbError 代码 CAS_MISMATCH,409),不递增任何版本;自 0.1.128 起,updateMany(orFilter, {}) 不再是锁。
20在所有写入路径、所有普通对象深度上,undefined 等同于缺失,null 等同于显式 NULL(自 0.1.128 起)。 在应用默认值和校验之前会裁剪值为 undefined 的属性:有默认值的列会采用其 DEFAULT,补丁不会对其执行 SET;不会移除数组元素;类实例不受影响。在非合并的嵌套对象中,值为 undefined 的可选叶子字段会按省略处理(填充为 null)。参见 references/crud.md、references/patch.md。
21SQLite 事务按驱动串行执行(自 0.1.128 起)。 withTransaction = FIFO 门控 + BEGIN IMMEDIATE;来自其他上下文的普通语句会等待 COMMIT。绝不要在 SQLite 事务或守卫内部等待外部 I/O(可能死锁——默认无超时;transactionWaitTimeoutMs → DbError("TX_WAIT_TIMEOUT") → 503,transactionWaitWarnMs 会发出警告);架构操作使用同一个连接门控(自 0.1.128 起),绝不会落入请求的事务中;每个数据库使用一个驱动。参见 references/adapters-sqlite.md。
22架构同步会在应用更改前拒绝操作(自 0.1.128 起)。 run() = 发现 → 预检查 → 执行;遇到可预知的不可行情况(对已有数据的表更改主键,或在存在活动外键时更改主键,自增列移出主键,删除仍被模型/视图引用的表,外键指向任何地方都不存在的表,物理表与托管视图同名)时,会返回 status: 'refused',且不执行任何 DDL、不持久化任何内容,并释放锁——启动时检查 status === 'synced' 的流程必须将其视为迁移失败。创建操作按父级优先执行,删除操作按子级优先执行(外键循环作为一个组处理);PG 删除绝不使用 CASCADE;安全模式下跳过的项目仍会被跟踪。参见 references/schema-sync.md。

关键导入

// Core
import { DbSpace, AtscriptDbTable, AtscriptDbView, BaseDbAdapter, DbError } from "@atscript/db";
import { syncSchema, planSchema, SchemaSync, readStoredSnapshot } from "@atscript/db/sync";
import { dbPlugin } from "@atscript/db/plugin"; // dbPlugin({ manifest: "atscript.models.ts" }) — path is rootDir-relative
import { $inc, $dec, $mul, $replace, $insert, $upsert, $update, $remove } from "@atscript/db/ops";
// Optimistic concurrency — see references/versioning.md
import { withOptimisticRetry, CasExhaustedError } from "@atscript/db";

// Adapters (pick one)
import {
  SqliteAdapter,
  BetterSqlite3Driver,
  createAdapter as sqliteSpace,
} from "@atscript/db-sqlite";
import { PostgresAdapter, PgDriver, createAdapter as pgSpace } from "@atscript/db-postgres";
import { MysqlAdapter, Mysql2Driver, createAdapter as mysqlSpace } from "@atscript/db-mysql";
import { MongoAdapter } from "@atscript/db-mongo";
import {
  MemoryAdapter,
  createAdapter as memorySpace,
  setMemoryProvider,
  buildMemoryPredicate,
  sortRows,
  projectRow, // shared JS-native engine — also backs moost-db value-help
} from "@atscript/db-memory";

// HTTP
import {
  AsDbController,
  AsDbReadableController,
  TableController,
  ReadableController,
  provideDbSpace, // register the DbSpace for token-bound controllers, BEFORE app.init()
  clearDbSpaces,
  assertExposed, // dev check: @db.http.path models without a bound controller
} from "@atscript/moost-db";
import { provideTestDbSpace, resetTestDbSpaces } from "@atscript/moost-db/testing";

// Browser client
import { Client } from "@atscript/db-client";

参考资料——只加载所需内容

领域文件适用场景
初次使用getting-started.md安装、atscript.config、第一个 .as 模型、DbSpace 配置、syncSchema、第一个 CRUD 调用
@db.* 注解annotations.md@db.table、@db.table.preferredId.uniqueIndex、@db.column、@db.default*、索引、@db.rel.*、@db.json、@db.ignore、@db.space、@meta.id、门控模式、@db.amount.currency[.ref]、@db.unit[.ref]、db.currencyCode 原语
Mongo 注解mongo-annotations.md@db.mongo.*:集合、封顶集合、search.text/static/dynamic/autocomplete(typeahead、edgeGram/nGram/rightEdgeGram)、查询时 fuzzy + $fuzzy 控制、索引 strategy(compound/autocomplete/text)、通过 $index 实现同一字段的多索引变体、patch.strategy、array.uniqueItems、原语
表与视图tables-and-views.mdDbSpace.getTable/getView/get、生命周期、ensureTable、syncIndexes、视图类型(托管/物化/外部)
CRUDcrud.mdinsertOne/Many、replaceOne/Many、updateOne/Many、deleteOne/Many、findOne/Many、count、bulkUpdate/Replace、DbError、undefined 属性 ≡ 缺失(0.1.128)、DbPatch / DbRow 载荷类型、写入守卫(TWriteOptions.guard / TDeleteOptions.guard)、replaceMany = $set 合并、空补丁计数路径
查询queries.md过滤运算符、$and / $or / $not、投影($select)、$sort、$skip / $limit / $page / $size、$count、$with、$groupBy 聚合、null 过滤器类型(NullableOptional、{ note: null } / $ne: null)、路径守卫(SQL 上的 JSON 后代、导航路径、物理名称会触发 INVALID_QUERY)
补丁语义patch.md字段操作($inc/$dec/$mul)、数组操作、@db.json 处理、@db.patch.strategy 合并与替换、@db.depth.limit 深度门控、Mongo CollectionPatcher
关系relations.md@db.rel.FK/.to/.from/.via、可选外键、引用完整性操作、controls.$with、/meta 上的分数引用深度、嵌套写入、通过视图/引用链提供值帮助(/meta 中的终端 ref + 继承的 db.rel.FK)
架构同步schema-sync.mdFNV-1a 哈希、__atscript_control 存储、分布式锁(podId、lockTtlMs、waitTimeoutMs)、@db.sync.method、safe 模式、onError 策略(默认大声报告失败)、planSchema 演练、生成的模型清单(dbPlugin({ manifest })、atscriptModels、modelsBySpace)、同步钩子、status: 'error' 条目 + 重试语义(出错时不持久化哈希)、删除已索引/被视图引用/全文检索列、复合索引定义漂移、status: 'refused' / 预检拒绝(0.1.128):“refused”、“primary key change” / PK 移动 / @meta.id 移动 / 复合键、“drop order” / “foreign key order” / 父级优先 / 子级优先 / “dropped right before” / 'drop' 重建或键重建表时被删除的子表 / “other objects depend on it” / FK 循环 / deferForeignKeysTo、“cannot drop … still referenced”、未知 FK 目标、表与视图名称冲突、dependsOn / dropGroup / pkChange / skipped / pending、安全模式下保留跟踪信息 + 待处理工作(“skipped (safe mode)”、暂缓快照 + 哈希)、视图连接条件 / having 哈希与一次性重建、isAtscriptDbView
SQLite 特性adapters-sqlite.mdBetterSqlite3Driver(选择启用 vector: true)、FTS5、用于 @db.search.vector 的 sqlite-vec / vec0 影子表、@db.column.collate、原生 FK、内存模式 :memory:、$regex → LIKE … ESCAPE '\'(受限子集,遇到 \d/[…]/(a|b)/量词会抛出异常)、每个驱动的事务门控 / BEGIN IMMEDIATE / transactionWaitTimeoutMs + transactionWaitWarnMs / TX_WAIT_TIMEOUT 503(0.1.128)
PostgreSQL 特性adapters-postgres.mdPgDriver、pgvector + HNSW、CITEXT、@db.pg.type、@db.pg.schema、@db.pg.collate、tsvector FTS
MySQL 特性adapters-mysql.mdMysql2Driver、@db.mysql.engine/.charset/.collate/.type/.unsigned/.onUpdate、VECTOR、FULLTEXT、默认 utf8mb4、列定义规则(0.1.128):绝不使用 DEFAULT NULL / NOT NULL DEFAULT NULL(ER 1067)、虚构类型默认值 + DROP DEFAULT、将 NULL 回填后再设为 NOT NULL、每列执行一次 MODIFY、表达式默认值要求 ≥ 8.0.13、“index prefix” / 键长度 768 / (255) / SUB_PART 漂移、以 KEY_COLUMN_USAGE 作为 PK 来源、单语句 PK 交换、在专用连接上使用 FOREIGN_KEY_CHECKS
MongoDB 特性adapters-mongo.mdMongoAdapter(db, client?)、聚合管道补丁、Atlas Search 文本 + 向量、atscript__ 索引前缀 + 物理索引名称辅助函数(用于原始驱动 $search 互操作的 mongoIndexKey/INDEX_PREFIX)、ObjectId 原语
内存特性adapters-memory.md内存适配器;由提供程序支持的运行时接口、内存测试、JS 原生过滤语义
自定义适配器creating-adapters.mdBaseDbAdapter 契约、抽象方法、可覆盖钩子、supports* 标志、复用 @atscript/db-sql-tools
moost-db HTTPmoost-db.mdAsDbController / AsDbReadableController 路由、TableController / ReadableController 绑定形式(模型令牌 / 惰性工厂 / 实例)、provideDbSpace + @db.space 多空间解析、super(moost) 子类回退、assertExposed、@db.http.path 解析、值帮助端点、guardWrite / guardRemove(表的写入守卫)+ withTransaction、形状门控 400(也适用于 onWrite 输出 → 500)、抛出的写入错误、reconcileCas 400 错误(0.1.128)、可排序元数据 / /meta.fields ⇔ 门控一致性(FieldCapabilityIndex、indexed 提示、400 信封)
操作actions.md@DbAction / @DbActionID* / @DbActionRow* / @InputForm / @DbActions* 装饰器、{ ids?, input? } 请求体信封、行/多行/表操作、processor: 'backend' | 'navigate' | 'custom'、同步批次 disabled 门控(通过 requiredFields 元组进行类型定义,必填)、perRow() 辅助函数、onDisabledRows、@DbActionRow* 投影扩宽、$actions=true 服务端评估行可用性增强、/meta 上的 inputForm + GET /meta/form/:name 表单架构端点(内置服务端输入验证;可从参数类型推断表单)、首选 ID 导航替换、ActionDisabledError、/meta 的 actions[] 结构
URL 查询语法http-query-syntax.mdURL 过滤器编码(field=v、!=、>、<、{v1,v2}、~=/re/i、范围)、$sort、$select、$with、$page、$size、$search/$index/$fuzzy(Mongo Atlas)、$vector/$threshold、各适配器的 JSON 子字段 / 嵌套路径规则、$having 别名 / 仅 $groupBy 可用的键($having key "x" must be an aggregate alias or a $groupBy field)、嵌套分组键、门控拒绝表
浏览器客户端db-client.mdClient<T extends AtscriptClientShape>、带 $with 响应收窄的类型化 CRUD 方法(ClientResponse<T, Q>)、client.action<R>(name, id?, input?) 信封形状契约、client.getActionForm(name) 延迟获取表单架构、过滤器构造、认证标头、ClientError / ActionDisabledError、元数据 + 验证器缓存、由首选 ID 驱动的导航 URL、$cas 提升为 version + PatchOf / RowOf 写入类型(0.1.128)TransportError(0.1.129:fetch 被拒绝或 2xx 响应体不是 JSON —— 无服务端判定,包含 method/url/cause,不继承 ClientError);非 JSON 错误响应体的 body.message 永不为空(回退为 HTTP <status>)
验证validation.mdcreateDbValidatorPlugin、buildDbValidator、服务端 + 客户端验证器、HTTP 错误结构、ValidatorMode
版本控制 / OCCversioning.md@db.column.version 注解、$cas 运算符、强制自动递增、withOptimisticRetry 辅助函数、CasExhaustedError、排除 updateMany、拒绝直接写入(DbError("VERSION_COLUMN_WRITE"))、HTTP 自动提升 + 409 kind: "version_mismatch" 响应体(@atscript/db-client 中的类型化 VersionMismatchError)+ 404 区分、/meta 中的 versionColumn、批量聚合响应、限制(无逐项冲突状态、不支持重命名的版本列)、仅 PK 的 $cas 版本化触碰 / 空补丁语义、version+$cas 冲突 400、db-client $cas 提升(0.1.128)touchMany(keys, { require: "all" | "any" }) 批量版本化触碰 + CasMismatchError(CAS_MISMATCH)→ 409(0.1.129)
字段加密encryption.md@db.encrypted、DbSpace encryption 选项(defaultKeyId、keys、用于 KMS/Vault 的 resolveKey、onUnencrypted)、封套格式、密钥轮换、明文列迁移、ENC_CONFIG_MISSING / ENC_KEY_INVALID / ENC_FIELD_FILTER / ENC_FIELD_SORT / ENC_FIELD_AGG / ENC_FIELD_PATCH_OP / ENC_NOT_ENCRYPTED / ENC_DECRYPT_FAILED、CSFLE 边界
地理搜索geo-search.mddb.geoPoint([lng, lat] —— 经度在前)、@db.index.geo、table.geoSearch() / geoSearchWithCount() / isGeoSearchable()、$maxDistance / $minDistance(米)、$distance 行字段、$geoWithin 圆形过滤器、GET /geo + $center、client.geoSearch/geoPages、所有适配器均原生支持(Mongo 2dsphere / PG PostGIS GiST / MySQL POINT SRID 4326 / SQLite haversine)、GEO_NOT_SUPPORTED(PG 未安装 PostGIS 时)/ GEO_INDEX_MISSING / FILTER_TYPE_MISMATCH、atscript__geo__* 托管索引
应用端测试testing.mdprovideTestDbSpace / resetTestDbSpaces(@atscript/moost-db/testing)、内存 SQLite(:memory:)、MongoDB 内存服务、测试数据填充、重置架构、通过测试工具驱动控制器、测试 CAS 命中/未命中
Reference docs: https://db.atscript.dev.

评论

支持 Markdown