Node.js 24のnode:sqlite入門:npmインストールなしでSQLiteを使う

スポンサーリンク

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 Objectfalse になるため注意が必要です。

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 以上を使うなら積極的に採用できる

関連記事:SQLiteチートシート:ログインからスキーマ確認・DMLまとめ