dart_node_sql_js

sql.js 的类型化 Dart 绑定 —— 编译为 WebAssembly 的 SQLite。为 Node.js 应用提供同步的纯内存 SQLite,并可显式持久化到磁盘。

与原生绑定不同,sql.js 无需编译,在任何支持 WebAssembly 的环境中运行方式都一致。 数据库存在于内存中;你可以通过 saveclose 将其持久化到文件。

安装

dependencies:
  dart_node_sql_js: ^0.13.0-beta
  nadz: ^0.0.7-beta

同时安装 npm 包:

npm install sql.js

快速开始

import 'package:dart_node_sql_js/dart_node_sql_js.dart';
import 'package:nadz/nadz.dart';

Future<void> main() async {
  // 启动时初始化一次 WebAssembly 运行时。
  final runtime = switch (await initializeSqlJs()) {
    Success(:final value) => value,
    Error(:final error) => throw Exception(error),
  };

  // 如果 ./my.db 存在则打开它,否则创建一个新数据库。
  final db = switch (openDatabase('./my.db', sqlJs: runtime)) {
    Success(:final value) => value,
    Error(:final error) => throw Exception(error),
  };

  db.exec('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)');

  final insert = switch (db.prepare('INSERT INTO users (name) VALUES (?)')) {
    Success(:final value) => value,
    Error(:final error) => throw Exception(error),
  };
  insert.run(['Alice']);

  final query = switch (db.prepare('SELECT * FROM users')) {
    Success(:final value) => value,
    Error(:final error) => throw Exception(error),
  };
  final rows = switch (query.all()) {
    Success(:final value) => value,
    Error(:final error) => throw Exception(error),
  };
  print(rows); // [{id: 1, name: Alice}]

  // 将内存中的数据库持久化到 ./my.db。
  db.close();
}

持久化

sql.js 完全在内存中运行。序列化它(export())的唯一方式会释放所有存活的预编译语句, 因此该绑定不会在每条语句之后写入磁盘。而是:

  • db.save() 按需将当前状态刷新到后端文件。
  • db.close() 先保存,再释放数据库。

重新打开同一路径会加载已持久化的字节。

API

initializeSqlJs() 返回 Future<Result<SqlJsRuntime, String>>。将该运行时传给 每一次 openDatabase 调用。

openDatabase(path, sqlJs: runtime) 返回 Result<Database, String>,包含:

成员 说明
prepare(sql) 准备一条可复用的语句。
exec(sql) 执行一条或多条语句,忽略结果。
pragma(value) 执行 PRAGMA
save() 将内存中的数据库持久化到其文件。
close() 先持久化,再关闭。
isOpen() 数据库是否仍处于打开状态。

预编译的 Statement 提供:

成员 说明
all([params]) 以列名为键的映射列表返回所有行。
get([params]) 第一行,或 null。
run([params]) 执行,返回 changeslastInsertRowid

每个操作都返回 Result(来自 nadz),而不是抛出异常。

许可证

BSD 3-Clause。参见 LICENSE