Electron で SQLite を使う方法
Electron で SQLite データベースを使用するには、sqlite3
モジュールをインストールし、適切に設定する必要があります。以下に手順を説明します。
プロジェクトの初期化
まず、新しい Electron プロジェクトを作成します。
npm init -y
npm install --save-dev electron
sqlite3 モジュールのインストール
npm install sqlite3
モジュールの読み込みとデータベースの接続
メインプロセス (通常は main.js
) で、sqlite3
モジュールを読み込み、データベースに接続します。
const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database('mydatabase.db', (err) => {
if (err) {
console.error(err.message);
}
console.log('Connected t o the database.');
});
データベース操作
データベースに接続したら、SQL クエリを実行してデータを読み書きできます。
// データの挿入
db.run('INSERT INTO users (name, age) VALUES (?, ?)', ['Alice', 30], (err) => {
if (err) {
console.error(err.message);
}
console.log('Row inserted.');
});
// データの取得
db.all('SELECT * FROM users', (err, rows) => {
if (err) {
console.error(err.message);
}
rows.forEach((row) => {
console.log(row.name, row.age);
});
});
// データベースのクローズ
db.close((err) => {
if (err) {
console.error(err.message);
}
console.log('Closed the database connection.');
});
注意
- Electron-Rebuild
Electron アプリケーションでネイティブモジュールを使用する場合、ビルドプロセスでelectron-rebuild
を使用して再ビルドする必要があります。 - IPC 通信
メインプロセスとレンダラープロセス間でデータのやり取りを行うには、IPC (Inter-Process Communication) メカニズムを使用します。 - メインプロセスでのみ使用
sqlite3
モジュールはメインプロセスでのみ使用できます。レンダラープロセスからデータベースに直接アクセスすることはできません。
追加のヒント
- パフォーマンス
大量のデータ操作を行う場合は、インデックスを作成したり、トランザクションを使用することでパフォーマンスを向上させることができます。 - セキュリティ
セキュリティ上のリスクを考慮し、データベースファイルのアクセス権限を適切に設定します。 - データベースの場所
データベースファイルの場所はプロジェクトのルートディレクトリを基準にします。 - エラー処理
常にエラー処理を行い、エラーが発生した場合は適切な対処を行います。
// main.js
const { app, BrowserWindow } = require('electron');
const sqlite3 = require('sqlite3').verbose();
let mainWindow;
function createWindow() {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true,
contextIsolation: false,
},
});
mainWindow.loadFile('index.html');
// Open the DevTools.
// mainWindow.webContents.openDevTools();
}
app.whenReady().then(() => {
createWindow();
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});
});
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit();
}
});
// Database connection
const db = new sqlite3.Database('mydatabase.db', (err) => {
if (err) {
console.error(err.message);
}
console.log('Connected to the database.');
// Create a table (if it doesn't exist)
db.run('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)', (err) => {
if (err) {
console.error(err.message);
}
console.log('Table created or already exists.');
});
});
// Insert data
db.run('INSERT INTO users (name, age) VALUES (?, ?)', ['Alice', 30], (err) => {
if (err) {
console.error(err.message);
}
console.log('Row inserted.');
});
// Retrieve data
db.all('SELECT * FROM users', (err, rows) => {
if (err) {
console.error(err.message);
}
rows.forEach((row) => {
console.log(row.name, row.age);
});
});
// Close the database connection
db.close((err) => {
if (err) {
console.error(err.message);
}
console.log('Closed the database connection.');
});
index.html
<!DOCTYPE html>
<html>
<head>
<title>Electron App with SQLite</title>
</head>
<body>
<h1>Hello from Electron!</h1>
<p>This app uses SQLite to store and retrieve data.</p>
</body>
</html>
Explanation
-
Main Process (main.js)
- Initializes the Electron app.
- Creates a main window.
- Connects to the SQLite database.
- Creates a table if it doesn't exist.
- Inserts data into the table.
- Retrieves data from the table.
- Closes the database connection.
-
Renderer Process (index.html)
- Displays a simple HTML page.
Key Points
- Database Closure
Theclose()
method is used to close the database connection. - Error Handling
Error handling is implemented to catch and log potential errors. - Data Retrieval
TheSELECT * FROM users
SQL statement retrieves all rows from theusers
table. - Data Insertion
TheINSERT INTO
SQL statement inserts a new row into theusers
table. - Table Creation
TheCREATE TABLE
SQL statement creates ausers
table withid
,name
, andage
columns. - Database Connection
A database connection is established to themydatabase.db
file. - SQLite Module
Thesqlite3
module is used to interact with the SQLite database.
Additional Considerations
- Performance
For large datasets, optimize your SQL queries and consider using indexes. - Security
Be cautious when handling sensitive data in SQLite databases. Consider encryption and other security measures. - Asynchronous Operations
SQLite operations are asynchronous, so you should use callbacks or promises to handle results and errors. - IPC Communication
For more complex interactions between the main and renderer processes, you can use Inter-Process Communication (IPC) mechanisms likeipcMain
andipcRenderer
.
Electron で SQLite を使う方法として、sqlite3
モジュール以外にもいくつかの選択肢があります。
WebSQL Database
- 欠点
WebSQL は廃止予定であり、新しいプロジェクトでは推奨されません。また、ブラウザのサポート状況によって制限があります。 - 利点
ブラウザの WebSQL API を利用するため、特別なモジュールをインストールする必要がありません。
IndexedDB
- 欠点
IndexedDB は複雑な API を持ち、直接 SQL クエリを実行することはできません。そのため、データの操作には JavaScript の API を使用します。
Electron-Sqlite
- 欠点
依存関係が増えるため、プロジェクトの複雑さが増す可能性があります。 - 利点
sqlite3
モジュールをラップして、より使いやすい API を提供します。
PouchDB
- 欠点
複雑な API を持ち、学習コストが高いかもしれません。 - 利点
CouchDB の API をエミュレートし、オフラインファーストのアプリケーションを構築できます。
選択のポイント
- 開発者のスキルと好み
開発者のスキルと好みによって、どの方法を選択するかが決まります。 - オフライン機能の必要性
オフライン機能が必要な場合は PouchDB が適しています。 - プロジェクトの規模と複雑さ
小規模なプロジェクトでは WebSQL や IndexedDB が十分な場合もありますが、大規模なプロジェクトではsqlite3
モジュールや Electron-Sqlite が適しています。
- メインプロセスでのみ使用
SQLite を操作するコードはメインプロセスで実行する必要があります。レンダラープロセスから直接 SQLite にアクセスすることはできません。
node.js sqlite npm