Published on

在 Electron 中集成 SQLite3 数据库

Authors
  • Name
    Twitter

SQLite3 是一个轻量级的、嵌入式的关系型数据库,非常适合用于 Electron 应用。本指南将帮助你在 Electron 项目中成功集成 SQLite3。

1. 安装必要的包

首先,我们需要安装 sqlite3 包和 electron-rebuild

npm install sqlite3
npm install --save-dev electron-rebuild

2. 重建 SQLite3

由于 Electron 使用的 Node.js 版本可能与你系统中的不同,我们需要重建 SQLite3 以确保兼容性。

package.json 中添加以下脚本:

{
  "scripts": {
    "postinstall": "electron-rebuild"
  }
}

然后运行:

npm run postinstall

3. 在主进程中使用 SQLite3

在 Electron 的主进程文件(通常是 main.js)中,你可以这样使用 SQLite3:

const sqlite3 = require('sqlite3').verbose();
const path = require('path');

// 打开数据库连接
const dbPath = path.join(__dirname, 'database.sqlite');
const db = new sqlite3.Database(dbPath, (err) => {
  if (err) {
    console.error('Could not connect to database', err);
  } else {
    console.log('Connected to database');
  }
});

// 创建表
db.run(`CREATE TABLE IF NOT EXISTS users (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT,
  email TEXT UNIQUE
)`);

// 插入数据
function insertUser(name, email) {
  const sql = `INSERT INTO users (name, email) VALUES (?, ?)`;
  db.run(sql, [name, email], (err) => {
    if (err) {
      return console.error(err.message);
    }
    console.log(`A row has been inserted with rowid ${this.lastID}`);
  });
}

// 查询数据
function getUsers() {
  return new Promise((resolve, reject) => {
    db.all(`SELECT * FROM users`, [], (err, rows) => {
      if (err) {
        reject(err);
      }
      resolve(rows);
    });
  });
}

4. 在渲染进程中使用数据库

由于安全原因,不建议直接在渲染进程中访问 SQLite3。相反,我们可以使用 IPC(进程间通信)在主进程和渲染进程之间传递数据。

在主进程中:

const { ipcMain } = require('electron');

ipcMain.handle('insert-user', async (event, name, email) => {
  insertUser(name, email);
});

ipcMain.handle('get-users', async () => {
  return await getUsers();
});

在渲染进程中:

const { ipcRenderer } = require('electron');

// 插入用户
async function insertUser(name, email) {
  await ipcRenderer.invoke('insert-user', name, email);
}

// 获取所有用户
async function getUsers() {
  const users = await ipcRenderer.invoke('get-users');
  console.log(users);
}

5. 关闭数据库连接

在应用退出时,记得关闭数据库连接:

app.on('will-quit', () => {
  db.close((err) => {
    if (err) {
      return console.error(err.message);
    }
    console.log('Closed the database connection.');
  });
});

6. 最佳实践

  1. 使用参数化查询:防止 SQL 注入攻击。
  2. 错误处理:始终处理可能出现的错误。
  3. 异步操作:使用异步方法避免阻塞主线程。
  4. 数据验证:在插入或更新数据之前进行验证。
  5. 备份:定期备份数据库文件。
  6. 版本控制:实现数据库版本控制机制,以便进行架构更新。

7. 性能优化

  • 使用事务处理批量操作。
  • 创建适当的索引以提高查询性能。
  • 定期执行 VACUUM 命令优化数据库。

通过遵循这个指南,你应该能够在 Electron 应用中成功集成和使用 SQLite3 数据库。记住,在处理用户数据时,安全性和数据完整性应该始终是首要考虑因素。