Node.js SQLite

概要:このチュートリアルでは、組み込みのSQLiteモジュールを使用してNode.jsアプリケーションからSQLiteと対話する方法を学びます。

Node.js 22.5.0では、node:sqliteという名前で実験的なSQLiteモジュールが導入されました。このチュートリアルでは、組み込みのnode:sqliteモジュールを使用して、SQLiteのテーブルからデータを挿入、更新、削除、選択する方法を学びます。

前提条件

  • JavaScriptの経験があること。
  • Node.jsの基本的な理解があること。
  • SQLiteに精通していること(そうでない場合は、このSQLiteチュートリアルを確認してください)。

新しいプロジェクトの作成

ステップ1:ターミナルを開き、プロジェクトを保存するための新しいディレクトリを作成します

mkdir sqlite-demoCode language: JavaScript (javascript)

ステップ2:プロジェクトディレクトリに移動します

cd sqlite-demoCode language: JavaScript (javascript)

ステップ3:npm initコマンドを使用してプロジェクトを初期化します

npm init --yCode language: JavaScript (javascript)

このコマンドにより、プロジェクトディレクトリにpackage.jsonファイルが作成されます。

ステップ4:プロジェクトディレクトリ内にindex.jsファイルを作成します。これがNode.jsアプリケーションのエントリーポイントになります。

ステップ5:ES6モジュールをサポートするようにpackage.jsonファイルを変更します

"type": "module",Code language: JavaScript (javascript)

そして、scriptsセクションでnpm startコマンドを設定します

"scripts": {
  "start": "node --experimental-sqlite index.js"
},Code language: JavaScript (javascript)

組み込みのSQLiteモジュールはまだ実験的なため、フラグ--experimental-sqliteが必要であることに注意してください。

ステップ6:npm startを使用してアプリケーションを実行します

npm startCode language: JavaScript (javascript)

--experimental-sqliteフラグ付きでindex.jsが実行されます。

データベース接続を開く

SQLiteデータベースファイルへの接続を開くには、DatabaseSyncコンストラクターを使用します

const db = new DatabaseSync(location[, options])Code language: JavaScript (javascript)

DatabaseSyncコンストラクターは2つの引数を受け取ります

  • locationは、SQLiteファイルへのパスを指定する文字列です。インメモリデータベースを使用する場合は、::memory::文字列を渡すことができます。
  • optionsは、接続オプションを指定するJavaScriptオブジェクトです。openプロパティがあり、ブール値を受け取ります。openがtrueの場合、データベースはDatabaseSyncコンストラクターによって開かれます。ただし、falseの場合は、DatabaseSyncオブジェクトのopen()メソッドを呼び出して、手動でデータベースを開く必要があります。

次の例は、プロジェクトディレクトリにあるデータベースファイル(db.sqlite)への接続を開く方法を示しています

import { DatabaseSync } from 'node:sqlite';

const db = new DatabaseSync('db.sqlite');Code language: JavaScript (javascript)

どのように機能するか。

まず、node:sqliteモジュールからDatabaseSyncクラスをインポートします

import { DatabaseSync } from 'node:sqlite';Code language: JavaScript (javascript)

次に、db.sqliteデータベースファイルへの接続を開くために、DatabaseSyncオブジェクトの新しいインスタンスを作成します

const db = new DatabaseSync('db.sqlite');Code language: JavaScript (javascript)

データベース接続を明示的に開く場合は、DatabaseSyncコンストラクターの2番目のパラメーターを使用できます

import { DatabaseSync } from 'node:sqlite';

const db = new DatabaseSync('contacts.db', { open: false });
db.open();Code language: JavaScript (javascript)

データベース接続を閉じる

開いているデータベース接続を閉じるには、DatabaseSyncオブジェクトのclose()メソッドを呼び出すことができます

db.close();Code language: JavaScript (javascript)

データベースが開いていないときにclose()メソッドを呼び出すと、例外がスローされます。

SQLiteファイルに接続し、データベース接続を閉じる完全なコードを次に示します

import { DatabaseSync } from 'node:sqlite';

// open a database connection
const db = new DatabaseSync('db.sqlite');

// interact with the database
// ..

// close the database
if (db) db.close();Code language: JavaScript (javascript)

新しいテーブルの作成

新しいテーブルを作成するには、DatabaseSyncオブジェクトのexec()メソッドを使用して、CREATE TABLEステートメントを実行できます。

exec()メソッドは、結果を返さずに任意のSQLステートメントを実行できることに注意してください。

たとえば、次の例は、contactsという名前の新しいテーブルを作成する方法を示しています

import { DatabaseSync } from 'node:sqlite';

// open a database connection
const db = new DatabaseSync('contacts.db');

// create a new table
db.exec(`
   create table if not exists contacts (
        id integer primary key, 
        firstName text not null, 
        lastName text not null, 
        email text not null    
   )`);

// close the database
if (db) db.close();Code language: JavaScript (javascript)

contactsテーブルには4つの列があります

  • idは自動インクリメントの主キーです。
  • firstNameは、連絡先の名前を保存します。
  • lastNameは、連絡先の姓を保存します。
  • emailは、連絡先のメールを保存します。

テーブルに行を挿入する

テーブルに行を挿入するには、次の手順に従います

まず、DatabaseSyncオブジェクトのprepare()メソッドを呼び出してプリペアドステートメントを作成します

const stmt = db.prepare(sql)Code language: JavaScript (javascript)

prepare()メソッドはSQL文字列を受け取り、型がStatementSyncのプリペアドステートメントオブジェクトを返します。

sqlステートメントは、insert、update、またはdeleteステートメントにすることができます。通常、INSERT INTO tableName(c1, c2) VALUES(?,?)のように、疑問符(?)として定義されたパラメータープレースホルダーが含まれます。

次に、値を使用してプリペアドステートメントを実行します

const result = stmt.run(value1, value2, ...)Code language: JavaScript (javascript)

run()メソッドはプリペアドステートメントを実行し、2つのプロパティを持つオブジェクトを返します

  • changes:SQLステートメントに応じて、挿入、更新、または削除された行数を返します。
  • lastInsertRowid:最後に挿入されたrowidを返します。sqlステートメントがinsertステートメントであり、テーブルにINTEGER PRIMARY KEYフィールドがある場合にのみ関連します。

たとえば、次の例は、contactsテーブルに新しい行を挿入する方法を示しています

import { DatabaseSync } from 'node:sqlite';

// open a database connection
const db = new DatabaseSync('contacts.db');

// create a new table
db.exec(`
   create table if not exists contacts (
        id integer primary key, 
        firstName text not null, 
        lastName text not null, 
        email text not null
   )`
);

// insert a new row
const stmt = db.prepare(
  `INSERT INTO contacts (first_name, last_name, email) 
   VALUES (?, ?, ?)`
);

const { lastInsertRowid } = stmt.run('Jane', 'Doe', '[email protected]');

console.log(`Inserted contact id: ${lastInsertRowid}`);

// close the database
if (db) db.close();Code language: JavaScript (javascript)

どのように機能するか。

まず、contactsテーブルに新しい行を挿入するプリペアドステートメントを作成します

const stmt = db.prepare(
  `INSERT INTO contacts (first_name, last_name, email) 
       VALUES (?, ?, ?)`
);Code language: JavaScript (javascript)

次に、名前、姓、およびメールの値を使用してプリペアドステートメントを実行します

const { lastInsertRowid } = stmt.run('Jane', 'Doe', '[email protected]');Code language: JavaScript (javascript)

オブジェクトの分割代入構文を使用して、結果オブジェクトからlastInsertRowidプロパティを分割代入することに注意してください。

3番目に、挿入されたIDをコンソールに表示します

console.log(`Inserted contact id: ${lastInsertRowid}`);Code language: JavaScript (javascript)

モジュールの再編成

ステップ1:次のコードを使用して、新しいファイルDB.jsを作成します

import { DatabaseSync } from 'node:sqlite';

export class DB {
  constructor(pathToSQLiteFile) {
    this.conn = new DatabaseSync(pathToSQLiteFile);
    this.#init();
  }

  #init() {
    this.conn.exec(`
        create table if not exists contacts (
            id integer primary key, 
            firstName text not null, 
            lastName text not null, 
            email text not null
    )`);
  }

  close() {
    if (this.conn) this.conn.close();
  }
}Code language: JavaScript (javascript)

DB.jsファイルで、次のことを行うDBクラスを定義します

  • まず、コンストラクターでSQLiteデータベースファイルへのデータベース接続を開き、init()メソッドを呼び出して、contactsテーブルが存在しない場合は作成します。init()プライベートメソッドであるため、DBクラス内で呼び出すことができることに注意してください。
  • 次に、close()メソッドでデータベース接続を閉じます。

ステップ2:同じディレクトリ内にContactDB.jsファイルを作成します

export class ContactDB {
  constructor(conn) {
    this.conn = conn;
  }

  create({ firstName, lastName, email }) {
    const stmt = this.conn.prepare(
      `INSERT INTO contacts (first_name, last_name, email) 
       VALUES (?, ?, ?)`
    );
    const { lastInsertRowid } = stmt.run(firstName, lastName, email);
    return { id: lastInsertRowid, firstName, lastName, email };
  }
}Code language: JavaScript (javascript)

どのように機能するか。

まず、コンストラクターでconnを初期化します

constructor(conn) {
    this.conn = conn;
}Code language: JavaScript (javascript)

connは、DatabaseSyncクラスのインスタンスです。

次に、contactsテーブルに新しい行を挿入するcreate()メソッドを定義します

create({ firstName, lastName, email }) {
  const stmt = this.conn.prepare(
    `INSERT INTO contacts (first_name, last_name, email) 
       VALUES (?, ?, ?)`
  );
  const { lastInsertRowid } = stmt.run(firstName, lastName, email);
  return { id: lastInsertRowid, firstName, lastName, email };
}Code language: JavaScript (javascript)

create()メソッドは、3つのプロパティfirstNamelastName、およびemailを持つオブジェクトを受け取ります。

create()メソッドは、プリペアドステートメントを作成し、引数付きでプリペアドステートメントを実行し、新しく挿入された連絡先を返します。

3番目に、index.jsを修正して、DB.jsおよびContactDB.jsモジュールを使用します

import { DB } from './DB.js';
import { ContactDB } from './ContactDB.js';

// open a database connection
const db = new DB('db.sqlite');

const contactDB = new ContactDB(db.conn);
const contact = contactDB.create({
  firstName: 'Jane',
  lastName: 'Doe',
  email: '[email protected]',
});
console.log(contact);

// close the database
db.close();Code language: JavaScript (javascript)

プログラムを実行すると、次の情報とともに新しく挿入された連絡先が表示されるはずです

{
  id: 1,
  firstName: 'Jane',
  lastName: 'Doe',
  email: '[email protected]'
}Code language: JavaScript (javascript)

テーブルからデータを読み取る

ステップ1:IDで連絡先を見つけるために、findByIdメソッドを連絡先モジュールに追加します

findById(id) {
   const stmt = this.conn.prepare(`SELECT * FROM contacts WHERE id = ?`);
   return stmt.get(id);
}Code language: JavaScript (javascript)

どのように機能するか。

まず、IDに基づいてcontactsテーブルから行を選択するプリペアドステートメントを作成します

const stmt = this.conn.prepare(`SELECT * FROM contacts WHERE id = ?`);Code language: JavaScript (javascript)

次に、入力IDでget()メソッドを実行します

return stmt.get(id);Code language: JavaScript (javascript)

ステップ2:findByIdメソッドを使用するようにindex.jsを修正します

import { DB } from './DB.js';
import { ContactDB } from './ContactDB.js';

// open a database connection
const db = new DB('db.sqlite');

const contactDB = new ContactDB(db.conn);
const contact = contactDB.findById(1);
console.log(contact);

// close the database connection
db.close();Code language: JavaScript (javascript)

ステップ3:index.jsファイルを実行します

npm startCode language: JavaScript (javascript)

出力

{
  id: 1,
  firstName: 'Jane',
  lastName: 'Doe',
  email: '[email protected]'
}Code language: JavaScript (javascript)

データの更新

ステップ1:連絡先を更新するupdate()メソッドを追加するように、ContactDB.jsモジュールを修正します

update({ id, firstName, lastName, email }) {
  const stmt = this.conn.prepare(
    `UPDATE contacts
       SET firstName = ?, lastName = ?, email = ?
       WHERE id = ?`
  );
  const { changes } = stmt.run(firstName, lastName, email, id);
  return changes;
}Code language: JavaScript (javascript)

どのように機能するか。

まず、IDで指定された連絡先の名前、姓、およびメールを更新するプリペアドステートメントを作成します

const stmt = this.conn.prepare(
  `UPDATE contacts
       SET firstName = ?, lastName = ?, email = ?
       WHERE id = ?`
);Code language: JavaScript (javascript)

次に、UPDATEステートメントを実行し、更新された行数を取得します

const { changes } = stmt.run(firstName, lastName, email, id);Code language: JavaScript (javascript)

3番目に、更新された行数を返します

return changes;Code language: JavaScript (javascript)

ステップ2:update()メソッドを使用するようにindex.jsを修正します

import { DB } from './DB.js';
import { ContactDB } from './ContactDB.js';

// open a database connection
const db = new DB('db.sqlite');
const contactDB = new ContactDB(db.conn);

// find the contact with id 1
const contact = contactDB.findById(1);

// update the last name and email
contact.lastName = 'Smith';
contact.email = '[email protected]';

// apply the changes to the database
contactDB.update(contact);

// close the database connection
db.close();Code language: JavaScript (javascript)

どのように機能するか。

まず、IDが1の連絡先を見つけます

const contact = contactDB.findById(1);Code language: JavaScript (javascript)

次に、姓とメールを更新します

contact.lastName = 'Smith';
contact.email = '[email protected]';Code language: JavaScript (javascript)

3番目に、変更をデータベースに適用します

contactDB.update(contact);Code language: JavaScript (javascript)

テーブルからデータを削除する

ステップ1:ContactDBクラスにdelete()メソッドを追加します

function delete(id) {
  const stmt = this.conn.prepare(`DELETE FROM contacts WHERE id = ?`);
  const { changes } = stmt.run(id);
  return changes;
}Code language: JavaScript (javascript)

どのように機能するか。

まず、IDでcontactsテーブルから行を削除するプリペアドステートメントを作成します

const stmt = this.conn.prepare(`DELETE FROM contacts WHERE id = ?`);Code language: JavaScript (javascript)

次に、入力IDでDELETEステートメントを実行し、削除された行数を取得します

const { changes } = stmt.run(id);Code language: JavaScript (javascript)

3番目に、削除された行数を返します

return changes;Code language: JavaScript (javascript)

ステップ2:ContactDBクラスのdelete()メソッドを使用するようにindex.jsファイルを修正します

import { DB } from './DB.js';
import { ContactDB } from './ContactDB.js';

// open a database connection
const db = new DB('db.sqlite');

const contactDB = new ContactDB(db.conn);

// delete contact with id 1
contactDB.delete(1);

// close the database connection
db.close();Code language: JavaScript (javascript)

ステップ3:IDで連絡先を削除するためにindex.jsを実行します

contactDB.delete(1);Code language: JavaScript (javascript)

SQLiteファイルを開くと、contactsテーブルに​​行がないことがわかります。

テーブルからすべての行を読み取る

ステップ1:contactsテーブルからすべての行を返すContactDBクラスにfindAll()メソッドを定義します

findAll() {
  const stmt = this.conn.prepare(`SELECT * FROM contacts`);
  return stmt.all();
}Code language: JavaScript (javascript)

どのように機能するか。

まず、contactsテーブルからすべての行を返すプリペアドステートメントを作成します

const stmt = this.conn.prepare(`SELECT * FROM contacts`);Code language: JavaScript (javascript)

次に、all()メソッドを呼び出して、結果セットを連絡先オブジェクトの配列として取得します

return stmt.all();Code language: JavaScript (javascript)

ステップ2:findAll()メソッドを使用するようにindex.jsファイルを修正します

import { DB } from './DB.js';
import { ContactDB } from './ContactDB.js';

// open a database connection
const db = new DB('db.sqlite');

const contactDB = new ContactDB(db.conn);

// insert 2 contacts
const contacts = [
  {
    firstName: 'John',
    lastName: 'Doe',
    email: '[email protected]',
  },
  {
    firstName: 'Jane',
    lastName: 'Smith',
    email: '[email protected]',
  },
];

for (const contact of contacts) {
  contactDB.create(contact);
}

// find all contacts
contactDB.findAll().forEach(console.log);

// close the database connection
db.close();Code language: JavaScript (javascript)

どのように機能するか。

まず、contactsテーブルに2つの新しい行を挿入します

const contacts = [
  {
    firstName: 'John',
    lastName: 'Doe',
    email: '[email protected]',
  },
  {
    firstName: 'Jane',
    lastName: 'Smith',
    email: '[email protected]',
  },
];

for (const contact of contacts) {
  contactDB.create(contact);
}Code language: JavaScript (javascript)

次に、すべての連絡先を見つけて、それぞれをコンソールに表示します

contactDB.findAll().forEach(console.log);Code language: JavaScript (javascript)

ステップ3:index.jsファイルを実行します

npm startCode language: JavaScript (javascript)

出力

 [
  {
    id: 2,
    firstName: 'John',
    lastName: 'Doe',
    email: '[email protected]'
  },
  {
    id: 3,
    firstName: 'Jane',
    lastName: 'Smith',
    email: '[email protected]'
  }
]Code language: JavaScript (javascript)

プロジェクトのソースコードをダウンロードします

プロジェクトのソースコードをダウンロードします

概要

  • DatabaseSyncクラスの新しいインスタンスを作成して、SQLiteデータベースファイルへの接続を開きます。
  • DatabaseSyncオブジェクトのclose()メソッドを呼び出して、データベース接続を閉じます。
  • DatabaseSyncオブジェクトのprepare()メソッドを呼び出して新しいプリペアドステートメントを作成し、DatabaseSyncrun()メソッドを呼び出してプリペアドステートメントを実行します。
  • get()メソッドを使用して、プリペアドステートメントによって返された最初の行を取得します。
  • all()メソッドを使用して、プリペアドステートメントのすべての行をオブジェクトの配列として取得します。
このチュートリアルは役に立ちましたか?