SQLite#

安定性: 1.1 - 活発な開発。

ソースコード: lib/sqlite.js

node:sqlite モジュールは、SQLite データベースの操作を容易にします。アクセスするには

import sqlite from 'node:sqlite';const sqlite = require('node:sqlite');

このモジュールは node: スキームでのみ利用可能です。

次の例は、node:sqlite モジュールを使用してインメモリデータベースを開き、データベースにデータを書き込み、その後データを読み戻す基本的な使用法を示しています。

import { DatabaseSync } from 'node:sqlite';
const database = new DatabaseSync(':memory:');

// Execute SQL statements from strings.
database.exec(`
  CREATE TABLE data(
    key INTEGER PRIMARY KEY,
    value TEXT
  ) STRICT
`);
// Create a prepared statement to insert data into the database.
const insert = database.prepare('INSERT INTO data (key, value) VALUES (?, ?)');
// Execute the prepared statement with bound values.
insert.run(1, 'hello');
insert.run(2, 'world');
// Create a prepared statement to read data from the database.
const query = database.prepare('SELECT * FROM data ORDER BY key');
// Execute the prepared statement and log the result set.
console.log(query.all());
// Prints: [ { key: 1, value: 'hello' }, { key: 2, value: 'world' } ]'use strict';
const { DatabaseSync } = require('node:sqlite');
const database = new DatabaseSync(':memory:');

// Execute SQL statements from strings.
database.exec(`
  CREATE TABLE data(
    key INTEGER PRIMARY KEY,
    value TEXT
  ) STRICT
`);
// Create a prepared statement to insert data into the database.
const insert = database.prepare('INSERT INTO data (key, value) VALUES (?, ?)');
// Execute the prepared statement with bound values.
insert.run(1, 'hello');
insert.run(2, 'world');
// Create a prepared statement to read data from the database.
const query = database.prepare('SELECT * FROM data ORDER BY key');
// Execute the prepared statement and log the result set.
console.log(query.all());
// Prints: [ { key: 1, value: 'hello' }, { key: 2, value: 'world' } ]

クラス: DatabaseSync#

このクラスは、SQLite データベースへの単一の 接続 を表します。このクラスによって公開されるすべてのAPIは同期的に実行されます。

new DatabaseSync(path[, options])#

  • path <string> | <Buffer> | <URL> データベースのパス。SQLite データベースはファイルに保存することも、完全に インメモリ にすることもできます。ファイルベースのデータベースを使用するには、パスはファイルパスである必要があります。インメモリデータベースを使用するには、パスは特別な名前 ':memory:' である必要があります。
  • options <Object> データベース接続のための設定オプション。以下のオプションがサポートされています。
    • open <boolean> true の場合、データベースはコンストラクタによって開かれます。この値が false の場合、データベースは open() メソッドを介して開く必要があります。デフォルト: true
    • readOnly <boolean> true の場合、データベースは読み取り専用モードで開かれます。データベースが存在しない場合、開くのに失敗します。デフォルト: false
    • enableForeignKeyConstraints <boolean> true の場合、外部キー制約が有効になります。これは推奨されますが、レガシーなデータベーススキーマとの互換性のために無効にすることもできます。外部キー制約の強制は、データベースを開いた後に PRAGMA foreign_keys を使用して有効または無効にすることができます。デフォルト: true
    • enableDoubleQuotedStringLiterals <boolean> true の場合、SQLite は 二重引用符で囲まれた文字列リテラル を受け入れます。これは推奨されませんが、レガシーなデータベーススキーマとの互換性のために有効にすることができます。デフォルト: false
    • allowExtension <boolean> true の場合、loadExtension SQL 関数と loadExtension() メソッドが有効になります。後で enableLoadExtension(false) を呼び出してこの機能を無効にすることができます。デフォルト: false
    • timeout <number> ミリ秒単位の ビジータイムアウト。これは、SQLite がエラーを返す前にデータベースロックが解放されるのを待つ最大時間です。デフォルト: 0
    • readBigInts <boolean> true の場合、整数フィールドは JavaScript の BigInt 値として読み取られます。false の場合、整数フィールドは JavaScript の数値として読み取られます。デフォルト: false
    • returnArrays <boolean> true の場合、クエリ結果はオブジェクトではなく配列として返されます。デフォルト: false
    • allowBareNamedParameters <boolean> true の場合、プレフィックス文字なしの名前付きパラメータのバインドを許可します(例::foo の代わりに foo)。デフォルト: true
    • allowUnknownNamedParameters <boolean> true の場合、バインド時に未知の名前付きパラメータは無視されます。false の場合、未知の名前付きパラメータに対して例外がスローされます。デフォルト: false

新しい DatabaseSync インスタンスを構築します。

database.aggregate(name, options)#

SQLite データベースに新しい集計関数を登録します。このメソッドは sqlite3_create_window_function() のラッパーです。

  • name <string> 作成する SQLite 関数の名前。
  • options <Object> 関数の設定。
    • deterministic <boolean> true の場合、作成された関数に SQLITE_DETERMINISTIC フラグが設定されます。デフォルト: false
    • directOnly <boolean> true の場合、作成された関数に SQLITE_DIRECTONLY フラグが設定されます。デフォルト: false
    • useBigIntArguments <boolean> true の場合、options.stepoptions.inverse への整数引数は BigInt に変換されます。false の場合、整数引数は JavaScript の数値として渡されます。デフォルト: false
    • varargs <boolean> true の場合、options.stepoptions.inverse は任意の数の引数(0 から SQLITE_MAX_FUNCTION_ARG まで)で呼び出されることがあります。false の場合、inversestep は厳密に length 個の引数で呼び出されなければなりません。デフォルト: false
    • start <number> | <string> | <null> | <Array> | <Object> | <Function> 集計関数の初期値。この値は集計関数が初期化されるときに使用されます。<Function> が渡された場合、その戻り値が初期値となります。
    • step <Function> 集計内の各行に対して呼び出される関数。この関数は現在の状態と行の値を受け取ります。この関数の戻り値は新しい状態でなければなりません。
    • result <Function> 集計の結果を取得するために呼び出される関数。この関数は最終的な状態を受け取り、集計の結果を返すべきです。
    • inverse <Function> この関数が提供されると、aggregate メソッドはウィンドウ関数として動作します。この関数は現在の状態と削除された行の値を受け取ります。この関数の戻り値は新しい状態でなければなりません。

ウィンドウ関数として使用される場合、result 関数は複数回呼び出されます。

const { DatabaseSync } = require('node:sqlite');

const db = new DatabaseSync(':memory:');
db.exec(`
  CREATE TABLE t3(x, y);
  INSERT INTO t3 VALUES ('a', 4),
                        ('b', 5),
                        ('c', 3),
                        ('d', 8),
                        ('e', 1);
`);

db.aggregate('sumint', {
  start: 0,
  step: (acc, value) => acc + value,
});

db.prepare('SELECT sumint(y) as total FROM t3').get(); // { total: 21 }import { DatabaseSync } from 'node:sqlite';

const db = new DatabaseSync(':memory:');
db.exec(`
  CREATE TABLE t3(x, y);
  INSERT INTO t3 VALUES ('a', 4),
                        ('b', 5),
                        ('c', 3),
                        ('d', 8),
                        ('e', 1);
`);

db.aggregate('sumint', {
  start: 0,
  step: (acc, value) => acc + value,
});

db.prepare('SELECT sumint(y) as total FROM t3').get(); // { total: 21 }

database.close()#

データベース接続を閉じます。データベースが開かれていない場合は例外がスローされます。このメソッドは sqlite3_close_v2() のラッパーです。

database.loadExtension(path)#

  • path <string> ロードする共有ライブラリへのパス。

データベース接続に共有ライブラリをロードします。このメソッドは sqlite3_load_extension() のラッパーです。DatabaseSync インスタンスを構築する際に allowExtension オプションを有効にする必要があります。

database.enableLoadExtension(allow)#

  • allow <boolean> 拡張機能のロードを許可するかどうか。

loadExtension SQL 関数と loadExtension() メソッドを有効または無効にします。構築時に allowExtensionfalse の場合、セキュリティ上の理由から拡張機能のロードを有効にすることはできません。

database.location([dbName])#

  • dbName <string> データベースの名前。これは 'main'(デフォルトのプライマリデータベース)または ATTACH DATABASE で追加された他のデータベースにすることができます。デフォルト: 'main'
  • 戻り値: <string> | <null> データベースファイルの場所。インメモリデータベースを使用している場合、このメソッドは null を返します。

このメソッドは sqlite3_db_filename() のラッパーです。

database.exec(sql)#

  • sql <string> 実行する SQL 文字列。

このメソッドは、結果を返さずに1つ以上の SQL ステートメントを実行できます。このメソッドは、ファイルから読み取った SQL ステートメントを実行する場合に便利です。このメソッドは sqlite3_exec() のラッパーです。

database.function(name[, options], function)#

  • name <string> 作成する SQLite 関数の名前。
  • options <Object> 関数のオプション設定。以下のプロパティがサポートされています。
    • deterministic <boolean> true の場合、作成された関数に SQLITE_DETERMINISTIC フラグが設定されます。デフォルト: false
    • directOnly <boolean> true の場合、作成された関数に SQLITE_DIRECTONLY フラグが設定されます。デフォルト: false
    • useBigIntArguments <boolean> true の場合、function への整数引数は BigInt に変換されます。false の場合、整数引数は JavaScript の数値として渡されます。デフォルト: false
    • varargs <boolean> true の場合、function は任意の数の引数(0 から SQLITE_MAX_FUNCTION_ARG まで)で呼び出されることがあります。false の場合、function は厳密に function.length 個の引数で呼び出されなければなりません。デフォルト: false
  • function <Function> SQLite 関数が呼び出されたときに呼び出す JavaScript 関数。この関数の戻り値は有効な SQLite データ型である必要があります。詳細は JavaScript と SQLite 間の型変換 を参照してください。戻り値が undefined の場合、結果はデフォルトで NULL になります。

このメソッドは SQLite のユーザー定義関数を作成するために使用されます。このメソッドは sqlite3_create_function_v2() のラッパーです。

database.setAuthorizer(callback)#

  • callback <Function> | <null> 設定するオーソライザー関数、または現在のオーソライザーをクリアするための null

プリペアドステートメントを介してデータにアクセスしようとしたり、データベーススキーマを変更しようとしたりするたびに SQLite が呼び出すオーソライザーコールバックを設定します。これは、セキュリティポリシーの実装、アクセスの監査、または特定の操作の制限に使用できます。このメソッドは sqlite3_set_authorizer() のラッパーです。

呼び出されると、コールバックは5つの引数を受け取ります。

  • actionCode <number> 実行されている操作のタイプ(例:SQLITE_INSERTSQLITE_UPDATESQLITE_SELECT)。
  • arg1 <string> | <null> 最初の引数(コンテキストに依存し、多くの場合テーブル名)。
  • arg2 <string> | <null> 2番目の引数(コンテキストに依存し、多くの場合カラム名)。
  • dbName <string> | <null> データベースの名前。
  • triggerOrView <string> | <null> アクセスを引き起こしているトリガーまたはビューの名前。

コールバックは以下の定数のいずれかを返さなければなりません。

  • SQLITE_OK - 操作を許可します。
  • SQLITE_DENY - 操作を拒否します(エラーを引き起こします)。
  • SQLITE_IGNORE - 操作を無視します(静かにスキップします)。
const { DatabaseSync, constants } = require('node:sqlite');
const db = new DatabaseSync(':memory:');

// Set up an authorizer that denies all table creation
db.setAuthorizer((actionCode) => {
  if (actionCode === constants.SQLITE_CREATE_TABLE) {
    return constants.SQLITE_DENY;
  }
  return constants.SQLITE_OK;
});

// This will work
db.prepare('SELECT 1').get();

// This will throw an error due to authorization denial
try {
  db.exec('CREATE TABLE blocked (id INTEGER)');
} catch (err) {
  console.log('Operation blocked:', err.message);
}import { DatabaseSync, constants } from 'node:sqlite';
const db = new DatabaseSync(':memory:');

// Set up an authorizer that denies all table creation
db.setAuthorizer((actionCode) => {
  if (actionCode === constants.SQLITE_CREATE_TABLE) {
    return constants.SQLITE_DENY;
  }
  return constants.SQLITE_OK;
});

// This will work
db.prepare('SELECT 1').get();

// This will throw an error due to authorization denial
try {
  db.exec('CREATE TABLE blocked (id INTEGER)');
} catch (err) {
  console.log('Operation blocked:', err.message);
}

database.isOpen#

  • 型: <boolean> データベースが現在開いているかどうか。

database.isTransaction#

  • 型: <boolean> データベースが現在トランザクション内にあるかどうか。このメソッドは sqlite3_get_autocommit() のラッパーです。

database.open()#

DatabaseSync コンストラクタの path 引数で指定されたデータベースを開きます。このメソッドは、データベースがコンストラクタ経由で開かれていない場合にのみ使用してください。データベースがすでに開いている場合は例外がスローされます。

database.prepare(sql)#

  • sql <string> プリペアドステートメントにコンパイルする SQL 文字列。
  • 戻り値: <StatementSync> プリペアドステートメント。

SQL ステートメントを プリペアドステートメント にコンパイルします。このメソッドは sqlite3_prepare_v2() のラッパーです。

database.createTagStore([maxSize])#

  • maxSize <integer> キャッシュするプリペアドステートメントの最大数。デフォルト: 1000
  • 戻り値: <SQLTagStore> プリペアドステートメントをキャッシュするための新しい SQL タグストア。

プリペアドステートメントを格納するための LRU (Least Recently Used) キャッシュである新しい SQLTagStore を作成します。これにより、一意の識別子でタグ付けすることで、プリペアドステートメントを効率的に再利用できます。

タグ付き SQL リテラルが実行されると、SQLTagStore はその特定の SQL 文字列のプリペアドステートメントがキャッシュにすでに存在するかどうかを確認します。存在する場合、キャッシュされたステートメントが使用されます。存在しない場合、新しいプリペアドステートメントが作成、実行され、将来の使用のためにキャッシュに保存されます。このメカニズムは、同じ SQL ステートメントを繰り返し解析および準備するオーバーヘッドを回避するのに役立ちます。

import { DatabaseSync } from 'node:sqlite';

const db = new DatabaseSync(':memory:');
const sql = db.createTagStore();

db.exec('CREATE TABLE users (id INT, name TEXT)');

// Using the 'run' method to insert data.
// The tagged literal is used to identify the prepared statement.
sql.run`INSERT INTO users VALUES (1, 'Alice')`;
sql.run`INSERT INTO users VALUES (2, 'Bob')`;

// Using the 'get' method to retrieve a single row.
const id = 1;
const user = sql.get`SELECT * FROM users WHERE id = ${id}`;
console.log(user); // { id: 1, name: 'Alice' }

// Using the 'all' method to retrieve all rows.
const allUsers = sql.all`SELECT * FROM users ORDER BY id`;
console.log(allUsers);
// [
//   { id: 1, name: 'Alice' },
//   { id: 2, name: 'Bob' }
// ] 

database.createSession([options])#

  • options <Object> セッションの設定オプション。
    • table <string> 変更を追跡する特定のテーブル。デフォルトでは、すべてのテーブルへの変更が追跡されます。
    • db <string> 追跡するデータベースの名前。これは、ATTACH DATABASE を使用して複数のデータベースが追加されている場合に便利です。デフォルト: 'main'
  • 戻り値: <Session> セッションハンドル。

セッションを作成し、データベースにアタッチします。このメソッドは sqlite3session_create()sqlite3session_attach() のラッパーです。

database.applyChangeset(changeset[, options])#

  • changeset <Uint8Array> バイナリのチェンジセットまたはパッチセット。
  • options <Object> 変更がどのように適用されるかの設定オプション。
    • filter <Function> 対象のテーブル名がこの関数に渡されたときに真の値を返す変更をスキップします。デフォルトでは、すべての変更が試行されます。

    • onConflict <Function> 競合をどのように処理するかを決定する関数。この関数は、以下のいずれかの値をとる1つの引数を受け取ります。

      • SQLITE_CHANGESET_DATA: DELETE または UPDATE の変更に、期待される「変更前」の値が含まれていません。
      • SQLITE_CHANGESET_NOTFOUND: DELETE または UPDATE 変更の主キーに一致する行が存在しません。
      • SQLITE_CHANGESET_CONFLICT: INSERT 変更により、重複する主キーが発生します。
      • SQLITE_CHANGESET_FOREIGN_KEY: 変更を適用すると、外部キー違反が発生します。
      • SQLITE_CHANGESET_CONSTRAINT: 変更を適用すると、UNIQUECHECK、または NOT NULL 制約違反が発生します。

      この関数は、以下のいずれかの値を返すべきです。

      • SQLITE_CHANGESET_OMIT: 競合する変更を省略します。
      • SQLITE_CHANGESET_REPLACE: 既存の値を競合する変更で置き換えます(SQLITE_CHANGESET_DATA または SQLITE_CHANGESET_CONFLICT の競合でのみ有効です)。
      • SQLITE_CHANGESET_ABORT: 競合時に中止し、データベースをロールバックします。

      競合ハンドラでエラーがスローされた場合、またはハンドラから他の値が返された場合、チェンジセットの適用は中止され、データベースはロールバックされます。

      デフォルト: SQLITE_CHANGESET_ABORT を返す関数。

  • 戻り値: <boolean> チェンジセットが中止されることなく正常に適用されたかどうか。

データベースが開いていない場合、例外がスローされます。このメソッドは sqlite3changeset_apply() のラッパーです。

const sourceDb = new DatabaseSync(':memory:');
const targetDb = new DatabaseSync(':memory:');

sourceDb.exec('CREATE TABLE data(key INTEGER PRIMARY KEY, value TEXT)');
targetDb.exec('CREATE TABLE data(key INTEGER PRIMARY KEY, value TEXT)');

const session = sourceDb.createSession();

const insert = sourceDb.prepare('INSERT INTO data (key, value) VALUES (?, ?)');
insert.run(1, 'hello');
insert.run(2, 'world');

const changeset = session.changeset();
targetDb.applyChangeset(changeset);
// Now that the changeset has been applied, targetDb contains the same data as sourceDb. 

database[Symbol.dispose]()#

データベース接続を閉じます。データベース接続がすでに閉じられている場合は、何もしません。

クラス: Session#

session.changeset()#

  • 戻り値: <Uint8Array> 他のデータベースに適用できるバイナリチェンジセット。

チェンジセットが作成されてからのすべての変更を含むチェンジセットを取得します。複数回呼び出すことができます。データベースまたはセッションが開いていない場合、例外がスローされます。このメソッドは sqlite3session_changeset() のラッパーです。

session.patchset()#

  • 戻り値: <Uint8Array> 他のデータベースに適用できるバイナリパッチセット。

上記のメソッドと似ていますが、よりコンパクトなパッチセットを生成します。SQLite のドキュメントの Changesets and Patchsets を参照してください。データベースまたはセッションが開いていない場合、例外がスローされます。このメソッドは sqlite3session_patchset() のラッパーです。

session.close().#

セッションを閉じます。データベースまたはセッションが開いていない場合、例外がスローされます。このメソッドは sqlite3session_delete() のラッパーです。

クラス: StatementSync#

このクラスは、単一の プリペアドステートメント を表します。このクラスは、そのコンストラクタを介してインスタンス化することはできません。代わりに、インスタンスは database.prepare() メソッドを介して作成されます。このクラスによって公開されるすべてのAPIは同期的に実行されます。

プリペアドステートメントは、それを作成するために使用された SQL の効率的なバイナリ表現です。プリペアドステートメントはパラメータ化可能であり、異なるバインド値で複数回呼び出すことができます。パラメータは、SQL インジェクション 攻撃に対する保護も提供します。これらの理由から、ユーザー入力を処理する際には、手作業で作成された SQL 文字列よりもプリペアドステートメントが推奨されます。

クラス: SQLTagStore#

このクラスは、プリペアドステートメントを格納するための単一の LRU (Least Recently Used) キャッシュを表します。

このクラスのインスタンスは、コンストラクタを使用するのではなく、database.createTagStore() メソッドを介して作成されます。ストアは、提供された SQL クエリ文字列に基づいてプリペアドステートメントをキャッシュします。同じクエリが再び現れると、ストアはキャッシュされたステートメントを取得し、パラメータバインディングを介して安全に新しい値を適用することで、SQL インジェクションのような攻撃を防ぎます。

キャッシュには、デフォルトで 1000 ステートメントの maxSize がありますが、カスタムサイズを提供することもできます(例:database.createTagStore(100))。このクラスによって公開されるすべての API は同期的に実行されます。

sqlTagStore.all(sqlTemplate[, ...values])#

  • sqlTemplate <Template Literal> SQLクエリを含むテンプレートリテラル。
  • ...values <any> テンプレートリテラルに挿入される値。
  • 戻り値: <Array> クエリによって返された行を表すオブジェクトの配列。

指定された SQL クエリを実行し、結果のすべての行をオブジェクトの配列として返します。

sqlTagStore.get(sqlTemplate[, ...values])#

  • sqlTemplate <Template Literal> SQLクエリを含むテンプレートリテラル。
  • ...values <any> テンプレートリテラルに挿入される値。
  • 戻り値: <Object> | <undefined> クエリによって返された最初の行を表すオブジェクト、または行が返されなかった場合は undefined

指定された SQL クエリを実行し、結果の最初の行をオブジェクトとして返します。

sqlTagStore.iterate(sqlTemplate[, ...values])#

  • sqlTemplate <Template Literal> SQLクエリを含むテンプレートリテラル。
  • ...values <any> テンプレートリテラルに挿入される値。
  • 戻り値: <Iterator> クエリによって返された行を表すオブジェクトを生成するイテレータ。

指定された SQL クエリを実行し、結果の行に対するイテレータを返します。

sqlTagStore.run(sqlTemplate[, ...values])#

  • sqlTemplate <Template Literal> SQLクエリを含むテンプレートリテラル。
  • ...values <any> テンプレートリテラルに挿入される値。
  • 戻り値: <Object> changeslastInsertRowid を含む実行に関する情報を持つオブジェクト。

行を返さないと予想される指定された SQL クエリを実行します(例:INSERT、UPDATE、DELETE)。

sqlTagStore.size()#

  • 戻り値: <integer> 現在キャッシュにあるプリペアドステートメントの数。

現在キャッシュにあるプリペアドステートメントの数を返す読み取り専用プロパティです。

sqlTagStore.capacity#

  • 戻り値: <integer> キャッシュが保持できるプリペアドステートメントの最大数。

キャッシュが保持できるプリペアドステートメントの最大数を返す読み取り専用プロパティです。

sqlTagStore.db#

  • <DatabaseSync> この SQLTagStore を作成した DatabaseSync インスタンス。

この SQLTagStore に関連付けられた DatabaseSync オブジェクトを返す読み取り専用プロパティです。

sqlTagStore.reset()#

LRU キャッシュをリセットし、保存されているすべてのプリペアドステートメントをクリアします。

sqlTagStore.clear()#

sqlTagStore.reset() のエイリアスです。

statement.all([namedParameters][, ...anonymousParameters])#

  • namedParameters <Object> 名前付きパラメータをバインドするために使用されるオプションのオブジェクト。このオブジェクトのキーはマッピングを設定するために使用されます。
  • ...anonymousParameters <null> | <number> | <bigint> | <string> | <Buffer> | <TypedArray> | <DataView> 匿名パラメータにバインドする0個以上の値。
  • 戻り値: <Array> オブジェクトの配列。各オブジェクトは、プリペアドステートメントを実行して返された行に対応します。各オブジェクトのキーと値は、行の列名と値に対応します。

このメソッドはプリペアドステートメントを実行し、すべての結果をオブジェクトの配列として返します。プリペアドステートメントが結果を返さない場合、このメソッドは空の配列を返します。プリペアドステートメントの パラメータは namedParametersanonymousParameters の値を使用してバインドされます。

statement.columns()#

  • 戻り値: <Array> オブジェクトの配列。各オブジェクトはプリペアドステートメントの列に対応し、次のプロパティを含みます。

    • column <string> | <null> 元のテーブル内のエイリアスなしの列名、または列が式またはサブクエリの結果である場合は null。このプロパティは sqlite3_column_origin_name() の結果です。
    • database <string> | <null> 元のデータベースのエイリアスなしの名前、または列が式またはサブクエリの結果である場合は null。このプロパティは sqlite3_column_database_name() の結果です。
    • name <string> SELECT ステートメントの結果セットで列に割り当てられた名前。このプロパティは sqlite3_column_name() の結果です。
    • table <string> | <null> 元のテーブルのエイリアスなしの名前、または列が式またはサブクエリの結果である場合は null。このプロパティは sqlite3_column_table_name() の結果です。
    • type <string> | <null> 列の宣言されたデータ型、または列が式またはサブクエリの結果である場合は null。このプロパティは sqlite3_column_decltype() の結果です。

このメソッドは、プリペアドステートメントによって返される列に関する情報を取得するために使用されます。

statement.expandedSQL#

  • 型: <string> パラメータ値を含むように展開されたソース SQL。

プリペアドステートメントのソース SQL テキストで、パラメータプレースホルダがこのプリペアドステートメントの最新の実行中に使用された値に置き換えられたもの。このプロパティは sqlite3_expanded_sql() のラッパーです。

statement.get([namedParameters][, ...anonymousParameters])#

  • namedParameters <Object> 名前付きパラメータをバインドするために使用されるオプションのオブジェクト。このオブジェクトのキーはマッピングを設定するために使用されます。
  • ...anonymousParameters <null> | <number> | <bigint> | <string> | <Buffer> | <TypedArray> | <DataView> 匿名パラメータにバインドする0個以上の値。
  • 戻り値: <Object> | <undefined> プリペアドステートメントを実行して返された最初の行に対応するオブジェクト。オブジェクトのキーと値は、行の列名と値に対応します。データベースから行が返されなかった場合、このメソッドは undefined を返します。

このメソッドはプリペアドステートメントを実行し、最初の結果をオブジェクトとして返します。プリペアドステートメントが結果を返さない場合、このメソッドは undefined を返します。プリペアドステートメントの パラメータは namedParametersanonymousParameters の値を使用してバインドされます。

statement.iterate([namedParameters][, ...anonymousParameters])#

  • namedParameters <Object> 名前付きパラメータをバインドするために使用されるオプションのオブジェクト。このオブジェクトのキーはマッピングを設定するために使用されます。
  • ...anonymousParameters <null> | <number> | <bigint> | <string> | <Buffer> | <TypedArray> | <DataView> 匿名パラメータにバインドする0個以上の値。
  • 戻り値: <Iterator> オブジェクトの反復可能なイテレータ。各オブジェクトは、プリペアドステートメントを実行して返された行に対応します。各オブジェクトのキーと値は、行の列名と値に対応します。

このメソッドはプリペアドステートメントを実行し、オブジェクトのイテレータを返します。プリペアドステートメントが結果を返さない場合、このメソッドは空のイテレータを返します。プリペアドステートメントの パラメータは namedParametersanonymousParameters の値を使用してバインドされます。

statement.run([namedParameters][, ...anonymousParameters])#

  • namedParameters <Object> 名前付きパラメータをバインドするために使用されるオプションのオブジェクト。このオブジェクトのキーはマッピングを設定するために使用されます。
  • ...anonymousParameters <null> | <number> | <bigint> | <string> | <Buffer> | <TypedArray> | <DataView> 匿名パラメータにバインドする0個以上の値。
  • 戻り値: <Object>
    • changes <number> | <bigint> 直近に完了した INSERTUPDATE、または DELETE ステートメントによって変更、挿入、または削除された行の数。このフィールドは、プリペアドステートメントの設定に応じて、数値または BigInt のいずれかになります。このプロパティは sqlite3_changes64() の結果です。
    • lastInsertRowid <number> | <bigint> 直近に挿入された行ID。このフィールドは、プリペアドステートメントの設定に応じて、数値または BigInt のいずれかになります。このプロパティは sqlite3_last_insert_rowid() の結果です。

このメソッドはプリペアドステートメントを実行し、結果の変更を要約したオブジェクトを返します。プリペアドステートメントの パラメータは namedParametersanonymousParameters の値を使用してバインドされます。

statement.setAllowBareNamedParameters(enabled)#

  • enabled <boolean> プレフィックス文字なしの名前付きパラメータのバインドのサポートを有効または無効にします。

SQLite パラメータの名前はプレフィックス文字で始まります。デフォルトでは、node:sqlite はパラメータをバインドする際にこのプレフィックス文字が存在することを要求します。しかし、ドル記号を除いて、これらのプレフィックス文字はオブジェクトキーで使用する際に追加の引用符を必要とします。

人間工学を改善するために、このメソッドを使用して、JavaScript コード内でプレフィックス文字を必要としないベアな名前付きパラメータを許可することができます。ベアな名前付きパラメータを有効にする際には、いくつかの注意点があります。

  • SQL ではプレフィックス文字が引き続き必要です。
  • JavaScript ではプレフィックス文字が引き続き許可されます。実際、プレフィックス付きの名前は、わずかに優れたバインディングパフォーマンスを発揮します。
  • 同じプリペアドステートメント内で $k@k のような曖昧な名前付きパラメータを使用すると、ベアな名前をどのようにバインドするかを決定できないため、例外が発生します。

statement.setAllowUnknownNamedParameters(enabled)#

  • enabled <boolean> 未知の名前付きパラメータのサポートを有効または無効にします。

デフォルトでは、パラメータのバインド中に未知の名前が見つかった場合、例外がスローされます。このメソッドは、未知の名前付きパラメータを無視することを許可します。

statement.setReturnArrays(enabled)#

  • enabled <boolean> クエリ結果を配列として返すことを有効または無効にします。

有効にすると、all()get()iterate() メソッドによって返されるクエリ結果は、オブジェクトではなく配列として返されます。

statement.setReadBigInts(enabled)#

  • enabled <boolean> データベースから INTEGER フィールドを読み取る際に BigInt を使用するかどうかを有効または無効にします。

データベースから読み取る際、SQLite の INTEGER はデフォルトで JavaScript の数値にマッピングされます。しかし、SQLite の INTEGER は JavaScript の数値が表現できるよりも大きな値を格納できます。そのような場合、このメソッドを使用して JavaScript の BigInt を使用して INTEGER データを読み取ることができます。このメソッドは、数値と BigInt の両方が常にサポートされているデータベース書き込み操作には影響しません。

statement.sourceSQL#

  • 型: <string> このプリペアドステートメントを作成するために使用されたソース SQL。

プリペアドステートメントのソース SQL テキスト。このプロパティは sqlite3_sql() のラッパーです。

JavaScript と SQLite 間の型変換#

Node.js が SQLite に書き込みまたは読み取りを行う際、JavaScript のデータ型と SQLite の データ型 の間で変換が必要です。JavaScript は SQLite よりも多くのデータ型をサポートしているため、JavaScript の型の一部のみがサポートされています。サポートされていないデータ型を SQLite に書き込もうとすると、例外が発生します。

SQLiteJavaScript
NULL<null>
INTEGER<number> または <bigint>
REAL<number>
TEXT<string>
BLOB<TypedArray> または <DataView>

sqlite.backup(sourceDb, path[, options])#

  • sourceDb <DatabaseSync> バックアップするデータベース。ソースデータベースは開いている必要があります。
  • path <string> | <Buffer> | <URL> バックアップを作成するパス。ファイルが既に存在する場合、内容は上書きされます。
  • options <Object> バックアップのオプション設定。以下のプロパティがサポートされています。
    • source <string> ソースデータベースの名前。これは 'main'(デフォルトのプライマリデータベース)または ATTACH DATABASE で追加された他のデータベースにすることができます。デフォルト: 'main'
    • target <string> ターゲットデータベースの名前。これは 'main'(デフォルトのプライマリデータベース)または ATTACH DATABASE で追加された他のデータベースにすることができます。デフォルト: 'main'
    • rate <number> バックアップの各バッチで転送されるページの数。デフォルト: 100
    • progress <Function> 各バックアップステップの後に呼び出されるオプションのコールバック関数。このコールバックに渡される引数は、バックアップ操作の現在の進捗を記述する remainingPages および totalPages プロパティを持つ <Object> です。
  • 戻り値: <Promise> 完了時にバックアップされたページの総数で解決される Promise、またはエラーが発生した場合に reject されます。

このメソッドはデータベースのバックアップを作成します。このメソッドは sqlite3_backup_init()sqlite3_backup_step()sqlite3_backup_finish() 関数を抽象化します。

バックアップされたデータベースは、バックアッププロセス中に通常通り使用できます。同じ接続(同じ <DatabaseSync> オブジェクト)からの変更はすぐにバックアップに反映されます。ただし、他の接続からの変更はバックアッププロセスを再起動させます。

const { backup, DatabaseSync } = require('node:sqlite');

(async () => {
  const sourceDb = new DatabaseSync('source.db');
  const totalPagesTransferred = await backup(sourceDb, 'backup.db', {
    rate: 1, // Copy one page at a time.
    progress: ({ totalPages, remainingPages }) => {
      console.log('Backup in progress', { totalPages, remainingPages });
    },
  });

  console.log('Backup completed', totalPagesTransferred);
})();import { backup, DatabaseSync } from 'node:sqlite';

const sourceDb = new DatabaseSync('source.db');
const totalPagesTransferred = await backup(sourceDb, 'backup.db', {
  rate: 1, // Copy one page at a time.
  progress: ({ totalPages, remainingPages }) => {
    console.log('Backup in progress', { totalPages, remainingPages });
  },
});

console.log('Backup completed', totalPagesTransferred);

sqlite.constants#

SQLite 操作で一般的に使用される定数を含むオブジェクト。

SQLite 定数#

以下の定数は sqlite.constants オブジェクトによってエクスポートされます。

競合解決定数#

以下の定数のいずれかが、database.applyChangeset() に渡される onConflict 競合解決ハンドラへの引数として利用可能です。SQLite ドキュメントの Constants Passed To The Conflict Handler も参照してください。

定数 説明
SQLITE_CHANGESET_DATA 競合ハンドラは、DELETE または UPDATE の変更を処理する際に、必要な PRIMARY KEY フィールドを持つ行がデータベースに存在するが、更新によって変更された他の(主キーでない)フィールドの1つ以上が期待される「変更前」の値を含んでいない場合に、この定数で呼び出されます。
SQLITE_CHANGESET_NOTFOUND 競合ハンドラは、DELETE または UPDATE の変更を処理する際に、必要な PRIMARY KEY フィールドを持つ行がデータベースに存在しない場合に、この定数で呼び出されます。
SQLITE_CHANGESET_CONFLICT この定数は、INSERT の変更を処理中に操作が重複する主キー値をもたらす場合に、競合ハンドラに渡されます。
SQLITE_CHANGESET_CONSTRAINT 外部キー処理が有効であり、チェンジセットを適用するとデータベースが外部キー違反を含む状態になる場合、チェンジセットがコミットされる直前に、競合ハンドラはこの定数で正確に1回呼び出されます。競合ハンドラが SQLITE_CHANGESET_OMIT を返す場合、外部キー制約違反を引き起こした変更を含む変更がコミットされます。または、SQLITE_CHANGESET_ABORT を返す場合、チェンジセットはロールバックされます。
SQLITE_CHANGESET_FOREIGN_KEY 変更の適用中に他の制約違反(すなわち UNIQUE、CHECK、または NOT NULL 制約)が発生した場合、競合ハンドラはこの定数で呼び出されます。

以下の定数のいずれかが、database.applyChangeset() に渡される onConflict 競合解決ハンドラから返されなければなりません。SQLite ドキュメントの Constants Returned From The Conflict Handler も参照してください。

定数 説明
SQLITE_CHANGESET_OMIT 競合する変更は省略されます。
SQLITE_CHANGESET_REPLACE 競合する変更が既存の値を置き換えます。この値は、競合のタイプが SQLITE_CHANGESET_DATA または SQLITE_CHANGESET_CONFLICT の場合にのみ返すことができることに注意してください。
SQLITE_CHANGESET_ABORT 変更が競合に遭遇したときに中止し、データベースをロールバックします。
認証定数#

以下の定数は database.setAuthorizer() メソッドで使用されます。

認証結果コード#

以下の定数のいずれかが、database.setAuthorizer() に渡されるオーソライザーコールバック関数から返されなければなりません。

定数 説明
SQLITE_OK 操作を通常通り続行することを許可します。
SQLITE_DENY 操作を拒否し、エラーを返させます。
SQLITE_IGNORE 操作を無視し、リクエストされなかったかのように続行します。
認証アクションコード#

以下の定数は、どの種類の操作が承認されているかを示すために、オーソライザーコールバック関数の最初の引数として渡されます。

定数 説明
SQLITE_CREATE_INDEX インデックスの作成
SQLITE_CREATE_TABLE テーブルの作成
SQLITE_CREATE_TEMP_INDEX 一時インデックスの作成
SQLITE_CREATE_TEMP_TABLE 一時テーブルの作成
SQLITE_CREATE_TEMP_TRIGGER 一時トリガーの作成
SQLITE_CREATE_TEMP_VIEW 一時ビューの作成
SQLITE_CREATE_TRIGGER トリガーの作成
SQLITE_CREATE_VIEW ビューの作成
SQLITE_DELETE テーブルからの削除
SQLITE_DROP_INDEX インデックスの削除
SQLITE_DROP_TABLE テーブルの削除
SQLITE_DROP_TEMP_INDEX 一時インデックスの削除
SQLITE_DROP_TEMP_TABLE 一時テーブルの削除
SQLITE_DROP_TEMP_TRIGGER 一時トリガーの削除
SQLITE_DROP_TEMP_VIEW 一時ビューの削除
SQLITE_DROP_TRIGGER トリガーの削除
SQLITE_DROP_VIEW ビューの削除
SQLITE_INSERT テーブルへの挿入
SQLITE_PRAGMA PRAGMA ステートメントの実行
SQLITE_READ テーブルからの読み取り
SQLITE_SELECT SELECT ステートメントの実行
SQLITE_TRANSACTION トランザクションの開始、コミット、またはロールバック
SQLITE_UPDATE テーブルの更新
SQLITE_ATTACH データベースのアタッチ
SQLITE_DETACH データベースのデタッチ
SQLITE_ALTER_TABLE テーブルの変更
SQLITE_REINDEX 再インデックス
SQLITE_ANALYZE データベースの分析
SQLITE_CREATE_VTABLE 仮想テーブルの作成
SQLITE_DROP_VTABLE 仮想テーブルの削除
SQLITE_FUNCTION 関数の使用
SQLITE_SAVEPOINT セーブポイントの作成、リリース、またはロールバック
SQLITE_COPY データのコピー(レガシー)
SQLITE_RECURSIVE 再帰クエリ