概要:このチュートリアルでは、組み込みのSQLiteモジュールを使用してNode.jsアプリケーションからSQLiteと対話する方法を学びます。
Node.js 22.5.0では、node:sqlite
という名前で実験的なSQLiteモジュールが導入されました。このチュートリアルでは、組み込みのnode:sqlite
モジュールを使用して、SQLiteのテーブルからデータを挿入、更新、削除、選択する方法を学びます。
前提条件
- JavaScriptの経験があること。
- Node.jsの基本的な理解があること。
- SQLiteに精通していること(そうでない場合は、このSQLiteチュートリアルを確認してください)。
新しいプロジェクトの作成
ステップ1:ターミナルを開き、プロジェクトを保存するための新しいディレクトリを作成します
mkdir sqlite-demo
Code language: JavaScript (javascript)
ステップ2:プロジェクトディレクトリに移動します
cd sqlite-demo
Code language: JavaScript (javascript)
ステップ3:npm init
コマンドを使用してプロジェクトを初期化します
npm init --y
Code 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 start
Code 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つのプロパティfirstName
、lastName
、および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 start
Code 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 start
Code 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()
メソッドを呼び出して新しいプリペアドステートメントを作成し、DatabaseSync
のrun()
メソッドを呼び出してプリペアドステートメントを実行します。get()
メソッドを使用して、プリペアドステートメントによって返された最初の行を取得します。all()
メソッドを使用して、プリペアドステートメントのすべての行をオブジェクトの配列として取得します。