多种方式,按需选择
专为前端打造的数据库引擎
Memory(内存)保证极致速度,Disk(IndexedDB / OPFS)提供持久化。Hybrid 模式 write-through 策略,读写均在微秒级完成。
手写递归下降 SQL 解析器。SELECT / INSERT / UPDATE / DELETE / JOIN / GROUP BY / HAVING / DISTINCT / 子查询。
beginTransaction / commitTransaction / rollbackTransaction 三件套。失败自动回滚,Memory 快照 + IndexedDB 延迟写入。
IN (SELECT ...) + 标量子查询。递归执行,自动将子查询结果替换为具体值。
references + ON DELETE CASCADE / SET NULL / RESTRICT。递归级联删除,自动维护引用完整性。
MetonaSqlark.connect() 单例复用,引用计数管理。避免重复打开 IndexedDB,自动释放资源。
14 种生命周期钩子:beforeCreateTable / afterInsert / beforeQuery / afterTransaction……按优先级注册。
纯 TypeScript 实现,不依赖任何第三方库。Tree-shakable,UMD/ESM/CJS 多格式输出,~10KB gzip。
COUNT / SUM / AVG / MIN / MAX 五大聚合函数,GROUP BY + HAVING 子句,DISTINCT 去重。
内置版本迁移系统,addMigration + migrateTo API。导入导出支持单表/全库 JSON 序列化。
subscribe() 订阅表变更。React useQuery / Vue useSqlarkQuery 开箱即用。
链式 API + TypeScript 泛型。.select().where().innerJoin().orderBy().limit() — 类型安全,IDE 友好。
清晰的分层结构,各模块职责单一
┌─────────────────────────────────────────────────────┐ │ MetonaSqlark / MeSqlark │ │ create() · query() · table() · tx() │ ├──────────┬──────────┬──────────┬──────────┬─────────┤ │ SQL Parser │ QueryBuilder │ Transaction│ Plugin │ Migration │ │ Lexer → │ .select() │ Manager │ Manager │ System │ │ Parser │ .where() │ │ 14 hooks │ │ ├──────────┴──────────┴──────────┴──────────┴─────────┤ │ QueryExecutor (AST → Results) │ │ JOIN · GROUP BY · HAVING · DISTINCT │ ├─────────────────────────────────────────────────────┤ │ IStorageEngine Interface │ ├──────────┬──────────┬──────────┬───────────────────┤ │ Memory │ IndexedDB │ OPFS │ Hybrid │ │ Engine │ Engine │ Engine │ Engine │ │ (Map) │ (IDB) │ (File) │ (Write-through) │ └──────────┴──────────┴──────────┴───────────────────┘
SQL + Query Builder 双 API — JOIN · 子查询 · 聚合 · 事务回滚 · 外键级联 · 连接池
// 创建数据库 — MeSqlark 是别名,完全等价 const db = await MetonaSqlark.create({ name: 'my-app', mode: 'hybrid' }); // 定义表结构 — 支持外键级联 await db.defineTable('users', { id: { type: 'string', primaryKey: true }, name: { type: 'string', required: true }, age: { type: 'number', default: 0 }, email: { type: 'string', unique: true, index: true }, }); // 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'); // Query Builder — 类型安全,链式调用 const rows2 = await db.table('users') .select(['name', 'age']).where({ age: { $gt: 18 } }) .orderBy('name').limit(10).execute(); // JOIN 多表关联 await db.query(`SELECT u.name, o.product, o.amount FROM users u INNER JOIN orders o ON u.id = o.user_id WHERE o.amount > 100`); // GROUP BY 聚合分析 await db.query(`SELECT dept, COUNT(*) as cnt, AVG(salary) as avg FROM employees GROUP BY dept HAVING COUNT(*) > 1`); // 事务 — 失败自动回滚 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 }); // 任何一步失败 → 自动回滚 }); // 子查询 — IN (SELECT ...) await db.query(`SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100)`); // 连接池 — 单例复用,避免重复打开 IndexedDB const db1 = await MetonaSqlark.connect({ name: 'my-app' }); const db2 = await MetonaSqlark.connect({ name: 'my-app' }); // db1 === db2(复用已有实例) await db2.disconnect(); // 引用计数 -1,归零时自动 close
MetonaSqlark 的核心指标