docs: README + site 更新 v0.1.13 新特性(事务回滚/子查询/外键级联/连接池)
CI / test (18.x) (push) Successful in 9m53s
CI / test (20.x) (push) Successful in 9m54s
CI / test (22.x) (push) Successful in 9m52s
CI / test (24.x) (push) Successful in 9m48s

This commit is contained in:
thzxx
2026-07-26 16:34:34 +08:00
parent 0f128da34a
commit b6d814aefe
4 changed files with 197 additions and 49 deletions
+44 -18
View File
@@ -151,7 +151,7 @@
<!-- Hero -->
<section class="hero">
<div class="container">
<div class="badge" style="margin-bottom:24px;"><span class="dot"></span> v0.1.12 已发布</div>
<div class="badge" style="margin-bottom:24px;"><span class="dot"></span> v0.1.13 已发布 — 事务回滚 · 子查询 · 外键级联 · 连接池</div>
<h1>前端的 <span class="gradient-text">SQL 数据库</span></h1>
<p>TypeScript 原生构建,内存与磁盘双模式,支持完整 SQL 查询。<br>零运行时依赖,开箱即用。</p>
<div class="actions">
@@ -237,32 +237,42 @@ npm install @metona-team/metona-sqlark
<div class="feature-card">
<div class="icon"></div>
<h3>完整 SQL 解析器</h3>
<p>手写递归下降 SQL 解析器,无第三方依赖。支持 SELECT / INSERT / UPDATE / DELETE / CREATE TABLE / DROP TABLE / JOIN / GROUP BY / HAVING / DISTINCT。</p>
</div>
<div class="feature-card">
<div class="icon">🔗</div>
<h3>Query Builder</h3>
<p>链式 API + TypeScript 泛型支持。.select().where().innerJoin().orderBy().limit() — IDE 自动补全,类型安全。</p>
<p>手写递归下降 SQL 解析器SELECT / INSERT / UPDATE / DELETE / JOIN / GROUP BY / HAVING / DISTINCT / 子查询</p>
</div>
<div class="feature-card">
<div class="icon">🔒</div>
<h3>事务支持</h3>
<p>原子性操作,事务内任意步骤失败自动回滚。IndexedDB 引擎原生事务 + Memory 引擎模拟事务</p>
<h3>事务回滚 <span style="font-size:0.65rem;color:var(--accent);vertical-align:super;">NEW</span></h3>
<p>beginTransaction / commitTransaction / rollbackTransaction 三件套。失败自动回滚,Memory 快照 + IndexedDB 延迟写入</p>
</div>
<div class="feature-card">
<div class="icon">🔍</div>
<h3>子查询 <span style="font-size:0.65rem;color:var(--accent);vertical-align:super;">NEW</span></h3>
<p>IN (SELECT ...) + 标量子查询。递归执行,自动将子查询结果替换为具体值。</p>
</div>
<div class="feature-card">
<div class="icon">🔗</div>
<h3>外键级联 <span style="font-size:0.65rem;color:var(--accent);vertical-align:super;">NEW</span></h3>
<p>references + ON DELETE CASCADE / SET NULL / RESTRICT。递归级联删除,自动维护引用完整性。</p>
</div>
<div class="feature-card">
<div class="icon">🏊</div>
<h3>连接池 <span style="font-size:0.65rem;color:var(--accent);vertical-align:super;">NEW</span></h3>
<p>MetonaSqlark.connect() 单例复用,引用计数管理。避免重复打开 IndexedDB,自动释放资源。</p>
</div>
<div class="feature-card">
<div class="icon">🧩</div>
<h3>插件系统</h3>
<p>14 种生命周期钩子:beforeCreateTable / afterInsert / beforeQuery / afterTransaction……按优先级注册,完整生命周期管理</p>
<p>14 种生命周期钩子:beforeCreateTable / afterInsert / beforeQuery / afterTransaction……按优先级注册。</p>
</div>
<div class="feature-card">
<div class="icon">📦</div>
<h3>零运行时依赖</h3>
<p>纯 TypeScript 实现,不依赖任何第三方库。Tree-shakableUMD/ESM/CJS 多格式输出,最小体积 ~10KB gzip。</p>
<p>纯 TypeScript 实现,不依赖任何第三方库。Tree-shakableUMD/ESM/CJS 多格式输出,~10KB gzip。</p>
</div>
<div class="feature-card">
<div class="icon">📊</div>
<h3>聚合 & 分组</h3>
<p>COUNT / SUM / AVG / MIN / MAX 五大聚合函数,GROUP BY + HAVING 子句,DISTINCT 去重,完整的数据分析能力</p>
<p>COUNT / SUM / AVG / MIN / MAX 五大聚合函数,GROUP BY + HAVING 子句,DISTINCT 去重。</p>
</div>
<div class="feature-card">
<div class="icon">🔄</div>
@@ -271,8 +281,13 @@ npm install @metona-team/metona-sqlark
</div>
<div class="feature-card">
<div class="icon">📡</div>
<h3>发布订阅</h3>
<p>subscribe() 订阅表变更事件,emit() 触发通知。React useQuery / Vue useSqlarkQuery 开箱即用。</p>
<h3>发布订阅 + 框架集成</h3>
<p>subscribe() 订阅表变更。React useQuery / Vue useSqlarkQuery 开箱即用。</p>
</div>
<div class="feature-card">
<div class="icon">🔗</div>
<h3>Query Builder</h3>
<p>链式 API + TypeScript 泛型。.select().where().innerJoin().orderBy().limit() — 类型安全,IDE 友好。</p>
</div>
</div>
</div>
@@ -312,13 +327,13 @@ npm install @metona-team/metona-sqlark
<div class="container">
<div class="section-title">
<h2>5 行<span>代码</span>开始</h2>
<p>像写 SQL 一样操作前端数据 — 或使用 Query Builder 链式 API</p>
<p>像写 SQL 一样操作前端数据 — v0.1.13 新增子查询、外键级联、事务回滚</p>
</div>
<div class="code-block">
<pre><span class="comment">// 创建数据库 — MeSqlark 是别名,完全等价</span>
<span class="keyword">const</span> db = <span class="keyword">await</span> <span class="func">MetonaSqlark.create</span>({ <span class="string">name</span>: <span class="string">'my-app'</span>, <span class="string">mode</span>: <span class="string">'hybrid'</span> });
<span class="comment">// 定义表结构</span>
<span class="comment">// 定义表结构 — 支持外键级联</span>
<span class="keyword">await</span> db.<span class="func">defineTable</span>(<span class="string">'users'</span>, {
<span class="string">id</span>: { <span class="string">type</span>: <span class="string">'string'</span>, <span class="string">primaryKey</span>: <span class="keyword">true</span> },
<span class="string">name</span>: { <span class="string">type</span>: <span class="string">'string'</span>, <span class="string">required</span>: <span class="keyword">true</span> },
@@ -344,11 +359,22 @@ npm install @metona-team/metona-sqlark
<span class="keyword">await</span> db.<span class="func">query</span>(<span class="string">`SELECT dept, COUNT(*) as cnt, AVG(salary) as avg
FROM employees GROUP BY dept HAVING COUNT(*) > 1`</span>);
<span class="comment">// 事务 — 原子操作</span>
<span class="comment">// 事务 — 失败自动回滚</span>
<span class="keyword">await</span> db.<span class="func">transaction</span>(<span class="keyword">async</span> (trx) => {
<span class="keyword">await</span> trx.<span class="func">table</span>(<span class="string">'users'</span>).<span class="func">insert</span>({ id: <span class="string">'3'</span>, name: <span class="string">'Charlie'</span> });
<span class="keyword">await</span> trx.<span class="func">table</span>(<span class="string">'orders'</span>).<span class="func">insert</span>({ id: <span class="string">'o1'</span>, userId: <span class="string">'3'</span>, amount: <span class="number">99</span> });
});</pre>
<span class="comment">// 任何一步失败 → 自动回滚</span>
});
<span class="comment">// 子查询 — IN (SELECT ...)</span>
<span class="keyword">await</span> db.<span class="func">query</span>(<span class="string">`SELECT * FROM users
WHERE id IN (SELECT user_id FROM orders WHERE amount > 100)`</span>);
<span class="comment">// 连接池 — 单例复用,避免重复打开 IndexedDB</span>
<span class="keyword">const</span> db1 = <span class="keyword">await</span> <span class="func">MetonaSqlark.connect</span>({ name: <span class="string">'my-app'</span> });
<span class="keyword">const</span> db2 = <span class="keyword">await</span> <span class="func">MetonaSqlark.connect</span>({ name: <span class="string">'my-app'</span> });
<span class="comment">// db1 === db2(复用已有实例)</span>
<span class="keyword">await</span> db2.<span class="func">disconnect</span>(); <span class="comment">// 引用计数 -1,归零时自动 close</span></pre>
</div>
</div>
</section>