概要:このチュートリアルでは、組み込みの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ステートメントであり、テーブルにINTEGERPRIMARYKEYフィールドがある場合にのみ関連します。
たとえば、次の例は、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 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()メソッドを呼び出して新しいプリペアドステートメントを作成し、DatabaseSyncのrun()メソッドを呼び出してプリペアドステートメントを実行します。get()メソッドを使用して、プリペアドステートメントによって返された最初の行を取得します。all()メソッドを使用して、プリペアドステートメントのすべての行をオブジェクトの配列として取得します。