dart_node_better_sqlite3

better-sqlite3 的类型化 Dart 绑定。为 Node.js 应用程序提供支持 WAL 模式的同步 SQLite3 访问。

安装

dependencies:
  dart_node_better_sqlite3: ^0.11.0-beta
  nadz: ^0.9.0

通过 npm 安装:

npm install better-sqlite3

快速开始

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

void main() {
  final db = switch (openDatabase('./my.db')) {
    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 stmt = switch (db.prepare('INSERT INTO users (name) VALUES (?)')) {
    Success(:final value) => value,
    Error(:final error) => throw Exception(error),
  };

  stmt.run(['Alice']);

  final query = switch (db.prepare('SELECT * FROM users')) {
    Success(:final value) => value,
    Error(:final error) => throw Exception(error),
  };

  final rows = query.all([]);
  print(rows);

  db.close();
}

核心概念

打开数据库

final db = switch (openDatabase('./my.db')) {
  Success(:final value) => value,
  Error(:final error) => throw Exception(error),
};

可以传递选项用于只读模式、内存数据库等。

执行 SQL

对于不返回数据的语句:

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

预处理语句

用于参数化查询:

final stmt = switch (db.prepare('INSERT INTO users (name, email) VALUES (?, ?)')) {
  Success(:final value) => value,
  Error(:final error) => throw Exception(error),
};

stmt.run(['Alice', 'alice@example.com']);
stmt.run(['Bob', 'bob@example.com']);

查询数据

final query = switch (db.prepare('SELECT * FROM users WHERE id = ?')) {
  Success(:final value) => value,
  Error(:final error) => throw Exception(error),
};

// 获取单行
final row = query.get([1]);

// 获取所有行
final allRows = query.all([]);

事务

db.exec('BEGIN');
try {
  // 多个操作...
  db.exec('COMMIT');
} catch (e) {
  db.exec('ROLLBACK');
  rethrow;
}

编译和运行

# 将 Dart 编译为 JavaScript
dart compile js -o app.js lib/main.dart

# 使用 Node.js 运行
node app.js

源代码

源代码可在 GitHub 上获取。