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
+60 -20
View File
@@ -1,7 +1,7 @@
# MetonaSqlark
<p align="center">
<img src="https://img.shields.io/badge/version-0.1.12-blue?style=flat-square" alt="version">
<img src="https://img.shields.io/badge/version-0.1.13-blue?style=flat-square" alt="version">
<img src="https://img.shields.io/badge/license-MIT-green?style=flat-square" alt="license">
<img src="https://img.shields.io/badge/coverage-93.46%25-brightgreen?style=flat-square" alt="coverage">
<img src="https://img.shields.io/badge/tests-264%20passed-success?style=flat-square" alt="tests">
@@ -11,6 +11,15 @@
---
## ✨ v0.1.13 新特性
- 🔒 **事务回滚**`beginTransaction/commitTransaction/rollbackTransaction` 真正的原子操作
- 🔍 **子查询**`IN (SELECT ...)` 和标量子查询 `= (SELECT ...)`
- 🔗 **外键级联**`ON DELETE CASCADE / SET NULL / RESTRICT` 递归级联删除
- 🏊 **连接池**`MetonaSqlark.connect()` 单例复用,引用计数管理
---
## 📦 安装
```bash
@@ -72,15 +81,6 @@ const { MetonaSqlark } = require('@metona-team/metona-sqlark');
</script>
```
### ES Module in Browser
```html
<script type="module">
import { MetonaSqlark } from './metona-sqlark.esm.js';
const db = await MetonaSqlark.create({ name: 'my-app', mode: 'hybrid' });
</script>
```
---
## 🚀 快速开始
@@ -94,7 +94,7 @@ const db = await MetonaSqlark.create({
diskEngine: 'indexeddb', // 'indexeddb' | 'opfs'
});
// 定义表
// 定义表 — 支持外键级联
await db.defineTable('users', {
id: { type: 'string', primaryKey: true },
name: { type: 'string', required: true },
@@ -102,6 +102,12 @@ await db.defineTable('users', {
email: { type: 'string', unique: true, index: true },
});
await db.defineTable('orders', {
id: { type: 'string', primaryKey: true },
user_id: { type: 'string', references: 'users.id', onDelete: 'CASCADE' },
amount: { type: 'number' },
});
// SQL 查询
await db.query("INSERT INTO users VALUES ('1', 'Alice', 30, 'alice@demo.com')");
const rows = await db.query('SELECT * FROM users WHERE age > 18 ORDER BY name');
@@ -117,14 +123,23 @@ const result = await db.table('users')
// JOIN
await db.query(`SELECT u.name, o.product FROM users u INNER JOIN orders o ON u.id = o.user_id`);
// 子查询 v0.1.13
await db.query(`SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100)`);
// GROUP BY
await db.query(`SELECT dept, COUNT(*) FROM employees GROUP BY dept HAVING COUNT(*) > 1`);
// 事务
// 事务 — 自动回滚 v0.1.13
await db.transaction(async (trx) => {
await trx.table('users').insert({ id: '3', name: 'Charlie' });
await trx.table('orders').insert({ id: 'o1', userId: '3', amount: 99 });
// 任何一步失败 → 全部回滚
});
// 连接池 v0.1.13
const db2 = await MetonaSqlark.connect({ name: 'my-app', mode: 'hybrid' });
// db2 === db(复用已有实例)
await db2.disconnect(); // 引用计数 -1
```
---
@@ -140,6 +155,20 @@ await db.transaction(async (trx) => {
| `diskEngine` | `'indexeddb' \| 'opfs'` | `'indexeddb'` | 磁盘引擎 |
| `version` | `number` | `1` | 版本号 |
### ColumnDef 列定义
| 属性 | 类型 | 说明 |
|------|------|------|
| `type` | `'string'\|'number'\|'boolean'\|'date'\|'json'` | 数据类型 |
| `primaryKey` | `boolean` | 主键 |
| `required` | `boolean` | 必填 |
| `unique` | `boolean` | 唯一约束 |
| `index` | `boolean` | 创建哈希索引 |
| `default` | `unknown` | 默认值 |
| `references` | `string` | 外键引用 `'table.column'` |
| `onDelete` | `'CASCADE'\|'SET NULL'\|'RESTRICT'` | 删除级联 🆕 |
| `onUpdate` | `'CASCADE'\|'SET NULL'\|'RESTRICT'` | 更新级联 🆕 |
### WHERE 操作符
| 操作符 | 含义 | 操作符 | 含义 |
@@ -156,12 +185,21 @@ await db.transaction(async (trx) => {
| `db.query(sql)` | 执行 SQL 字符串 |
| `db.table(name)` | 获取表操作对象 |
| `db.defineTable(name, cols)` | 定义表结构 |
| `db.transaction(fn)` | 执行事务 |
| `db.transaction(fn)` | 执行事务(自动回滚)🆕 |
| `db.exportTable(name)` / `db.exportAll()` | 导出数据 JSON |
| `db.importTable(name, data)` | 导入数据 |
| `db.addMigration(v, fn)` / `db.migrateTo(v)` | 数据迁移 |
| `db.subscribe(table, fn)` | 订阅表变更 |
| `db.on(hook, fn)` | 注册钩子 |
| `db.on(hook, fn)` | 注册钩子 14 种) |
### 连接池(v0.1.13
| 静态方法 | 说明 |
|------|------|
| `MetonaSqlark.connect(config)` | 获取或创建数据库实例(单例复用)🆕 |
| `MetonaSqlark.disconnect(name)` | 释放连接(引用计数 -1)🆕 |
| `MetonaSqlark.disconnectAll()` | 强制关闭所有连接 🆕 |
| `MetonaSqlark.getActiveConnections()` | 获取活跃连接列表 🆕 |
### React / Vue 集成
@@ -197,7 +235,7 @@ npm run typecheck # 类型检查
| 测试用例 | 264 |
| 测试套件 | 15 |
| 语句覆盖率 | 93.46% |
| SQL 关键字 | 29 |
| SQL 关键字 | 31 |
| 存储引擎 | 4Memory / IndexedDB / OPFS / Hybrid |
---
@@ -208,14 +246,16 @@ npm run typecheck # 类型检查
src/
├── index.ts # 入口(MetonaSqlark + MeSqlark
├── core.ts # 主类
├── constants.ts # 类型定义 + 配置
├── constants.ts # 类型定义 + 配置 + DatabaseError
├── connection-manager.ts # 连接池管理 🆕
├── utils.ts # 工具函数
├── engine/ # 存储引擎(Memory/IndexedDB/OPFS
├── hybrid/ # 混合引擎
├── hybrid/ # 混合引擎write-through
├── table/ # 表管理 + Schema 校验
├── query/ # AST + Builder + Compiler + Executor
├── sql/ # Lexer + Parser
├── transaction/ # 事务管理
├── plugin/ # 插件系统
├── sql/ # Lexer + Parser(递归下降)
├── transaction/ # 事务管理(支持回滚)
├── plugin/ # 插件系统14 hooks
└── integrations/ # React / Vue hooks
```