dart_node_better_sqlite3

Typed Dart bindings for better-sqlite3. Provides synchronous SQLite3 access with WAL mode support for Node.js applications.

Installation

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

Also install the npm package:

npm install better-sqlite3

Quick Start

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();
}

Core Concepts

Opening a Database

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

Options can be passed for read-only mode, memory databases, etc.

Executing SQL

For statements that don't return data:

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

Prepared Statements

For parameterized queries:

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']);

Querying Data

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

// Get single row
final row = query.get([1]);

// Get all rows
final allRows = query.all([]);

Transactions

db.exec('BEGIN');
try {
  // Multiple operations...
  db.exec('COMMIT');
} catch (e) {
  db.exec('ROLLBACK');
  rethrow;
}

Compile and Run

# Compile Dart to JavaScript
dart compile js -o app.js lib/main.dart

# Run with Node.js
node app.js

Source Code

The source code is available on GitHub.