Node.js 24のnode:sqlite入門:npmインストールなしでSQLiteを使う
Node.js 22.5(2024年7月)で追加された node:sqlite の現状を整理します。
better-sqlite3 などのパッケージをインストールせずに SQLite を扱えます。
バージョンと安定性 - Node.js 22.13 / 23.4 以降:
--experimental-sqliteフラグ不要 - Node.js 24:フラグなしで動作、Stability =1.2 Release candidate(実験的扱い継続) - Node.js 26:安定版(Stability = 2 Stable)本番利用は Node.js 26 以降を推奨します。 公式ドキュメント:Node.js SQLite | Node.js Documentation
node:sqlite とは
Node.js に組み込まれた SQLite モジュールです。
npm install 不要で import するだけで使えます。
import { DatabaseSync } from 'node:sqlite';
API は 同期(Sync) です。better-sqlite3 と同じく、async/await なしで書けます。
基本的な使い方
DB を開く
import { DatabaseSync } from 'node:sqlite';
// ファイル
const db = new DatabaseSync('app.db');
// インメモリ(テスト用)
const db = new DatabaseSync(':memory:');
テーブル作成・INSERT・SELECT
import { DatabaseSync } from 'node:sqlite';
const db = new DatabaseSync(':memory:');
db.exec(`
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER
)
`);
const insert = db.prepare('INSERT INTO users (name, age) VALUES (?, ?)');
insert.run('Alice', 30);
insert.run('Bob', 25);
// 全件取得
const getAll = db.prepare('SELECT * FROM users');
console.log(getAll.all());
// 1件取得
const getOne = db.prepare('SELECT * FROM users WHERE id = ?');
console.log(getOne.get(1));
db.close();
run() の戻り値
const result = insert.run('Carol', 35);
console.log(result);
// { changes: 1, lastInsertRowid: 3 }
changes(変更行数)と lastInsertRowid(最後のINSERT ID)が取得できます。
トランザクション
db.exec() で BEGIN / COMMIT / ROLLBACK を発行します。
db.exec('BEGIN');
try {
insert.run('Dave', 28);
insert.run('Eve', 22);
db.exec('COMMIT');
} catch (err) {
db.exec('ROLLBACK');
throw err;
}
行データは null prototype オブジェクト
get() / all() が返すオブジェクトは [Object: null prototype] 型です。
通常の操作(プロパティアクセス・JSON.stringify・スプレッド構文)は問題なく動きますが、
instanceof Object が false になるため注意が必要です。
const row = getOne.get(1);
console.log(row.name); // 'Alice'(アクセスはOK)
console.log(JSON.stringify(row)); // '{"id":1,"name":"Alice","age":30}'(OK)
console.log({ ...row }); // { id: 1, name: 'Alice', age: 30 }(OK)
console.log(row instanceof Object); // false(注意)
プレーンなオブジェクトとして扱いたい場合はスプレッド構文で変換します。
const rows = getAll.all().map(row => ({ ...row }));
better-sqlite3 との比較
| 項目 | node:sqlite | better-sqlite3 |
|---|---|---|
| インストール | 不要(組み込み) | npm install better-sqlite3 |
| Node.js バージョン | 22.13以上(26で安定版) | Node.js 制限なし |
| API スタイル | 同期 | 同期 |
| 行データの型 | null prototype オブジェクト | 通常のオブジェクト |
| トランザクション | db.exec('BEGIN/COMMIT') |
db.transaction() ヘルパーあり |
| パフォーマンス | ネイティブ組み込み | ネイティブバインディング |
| 本番実績 | 安定版になったばかり | 実績多数 |
どちらを選ぶか
node:sqlite を選ぶケース
- 依存パッケージを増やしたくないとき
- Node.js 24 以上が確定している環境
- スクリプトや CLI ツールで手軽に SQLite を使いたいとき
better-sqlite3 を選ぶケース
- Node.js 22 以下もサポートする必要があるとき
db.transaction()のようなユーティリティを使いたいとき- 本番環境で実績のあるライブラリを使いたいとき
まとめ
node:sqliteは Node.js 22.13 以降フラグ不要。Node.js 26 で安定版- API は
better-sqlite3に近い同期スタイル - 行データが null prototype オブジェクトで返る点だけ注意
- 新規プロジェクトで Node.js 24 以上を使うなら積極的に採用できる