多种方式,按需选择
专为前端打造的数据库引擎
Memory(内存)保证极致速度,Disk(IndexedDB / OPFS)提供持久化。Hybrid 模式 write-through 策略,读写均在微秒级完成。
手写递归下降 SQL 解析器,无第三方依赖。支持 SELECT / INSERT / UPDATE / DELETE / CREATE TABLE / DROP TABLE / JOIN / GROUP BY / HAVING / DISTINCT。
链式 API + TypeScript 泛型支持。.select().where().innerJoin().orderBy().limit() — IDE 自动补全,类型安全。
原子性操作,事务内任意步骤失败自动回滚。IndexedDB 引擎原生事务 + Memory 引擎模拟事务。
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() 订阅表变更事件,emit() 触发通知。React useQuery / Vue useSqlarkQuery 开箱即用。
清晰的分层结构,各模块职责单一
┌─────────────────────────────────────────────────────┐ │ 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
// 创建数据库 — 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 }); });
MetonaSqlark 的核心指标