docs: README + site 更新 v0.1.13 新特性(事务回滚/子查询/外键级联/连接池)
This commit is contained in:
@@ -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 |
|
||||
| 存储引擎 | 4(Memory / 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
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user