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.13.0-beta
nadz: ^0.0.7-beta
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 = switch (query.all()) {
Success(:final value) => value,
Error(:final error) => throw Exception(error),
};
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 = switch (query.get([1])) {
Success(:final value) => value,
Error(:final error) => throw Exception(error),
};
// Get all rows
final allRows = switch (query.all()) {
Success(:final value) => value,
Error(:final error) => throw Exception(error),
};
Transactions
db.exec('BEGIN');
// Multiple operations...
final result = db.exec('INSERT INTO users (name) VALUES (?)');
switch (result) {
case Success():
db.exec('COMMIT');
case Error(:final error):
db.exec('ROLLBACK');
throw Exception(error);
}
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.