在 Electron 框架中完成数据库的连接、读取和写入

news/2025/11/28 8:57:37/文章来源:https://www.cnblogs.com/yangykaifa/p/19280178

在 Electron 框架中实现数据库的连接、读取和写入,核心思路是在主进程中处理数据库逻辑(避免敏感信息暴露),通过 IPC(进程间通信)与渲染进程交互。以下是详细实现方案(以本地嵌入式数据库 SQLite 为例,兼顾其他数据库思路)。

一、技术选型与准备

1. 数据库选择
2. 核心依赖
  • electron:Electron 框架核心。
  • sqlite3:SQLite 的 Node.js 驱动(异步操作)。
  • electron-rebuild:解决原生模块(如sqlite3)与 Electron 的兼容性问题。
3. 项目初始化
# 创建项目
mkdir electron-db-demo && cd electron-db-demo
npm init -y
# 安装依赖
npm install electron sqlite3 --save
npm install electron-rebuild --save-dev
4. 重建原生模块(关键步骤)

sqlite3是原生模块,需与 Electron 的 Node 版本匹配,执行重建:

# 配置重建脚本(package.json中添加)
"scripts": {
"rebuild": "electron-rebuild -f -w sqlite3"
}
# 执行重建
npm run rebuild

二、实现核心逻辑

1. 项目结构
electron-db-demo/
├─ main.js        # 主进程(数据库操作+窗口管理)
├─ preload.js     # 预加载脚本(安全暴露IPC接口)
├─ index.html     # 渲染进程(UI+用户交互)
└─ package.json
2. 主进程(main.js):数据库操作 + IPC 监听

主进程负责数据库连接、CRUD 操作,并通过ipcMain接收渲染进程的请求。

const { app, BrowserWindow, ipcMain } = require('electron');
const sqlite3 = require('sqlite3').verbose();
const path = require('path');
// 数据库文件路径(存放在Electron默认的用户数据目录,避免权限问题)
const dbPath = path.join(app.getPath('userData'), 'mydb.db');
// 初始化数据库连接
let db;
function initDB() {
return new Promise((resolve, reject) => {
db = new sqlite3.Database(dbPath, (err) => {
if (err) {
console.error('数据库连接失败:', err.message);
reject(err);
} else {
console.log('数据库连接成功');
// 创建示例表(如users表)
db.run(`CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER
)`, (err) => {
if (err) reject(err);
else resolve();
});
}
});
});
}
// 封装数据库操作(Promise化,避免回调地狱)
const dbHelper = {
// 插入数据
insert: (table, data) => {
return new Promise((resolve, reject) => {
const keys = Object.keys(data).join(',');
const placeholders = Object.keys(data).map(() => '?').join(',');
const values = Object.values(data);
const sql = `INSERT INTO ${table} (${keys}) VALUES (${placeholders})`;
db.run(sql, values, function(err) {
if (err) reject(err);
else resolve({ id: this.lastID }); // 返回插入的ID
});
});
},
// 查询数据(全部)
queryAll: (table) => {
return new Promise((resolve, reject) => {
const sql = `SELECT * FROM ${table}`;
db.all(sql, (err, rows) => {
if (err) reject(err);
else resolve(rows);
});
});
}
};
// 创建窗口
function createWindow() {
const mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: path.join(__dirname, 'preload.js'), // 预加载脚本
contextIsolation: true // 开启上下文隔离(安全要求)
}
});
mainWindow.loadFile('index.html');
}
// 初始化流程
app.whenReady().then(async () => {
await initDB(); // 等待数据库初始化完成
createWindow();
// IPC监听:处理渲染进程的数据库请求
// 1. 插入数据
ipcMain.handle('db-insert', async (event, table, data) => {
try {
return await dbHelper.insert(table, data);
} catch (err) {
throw err; // 抛出错误,让渲染进程捕获
}
});
// 2. 查询所有数据
ipcMain.handle('db-query-all', async (event, table) => {
try {
return await dbHelper.queryAll(table);
} catch (err) {
throw err;
}
});
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow();
});
});
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') app.quit();
});
3. 预加载脚本(preload.js):安全暴露 IPC 接口

由于 Electron 开启上下文隔离后,渲染进程无法直接访问ipcRenderer,需通过预加载脚本暴露有限接口。

const { contextBridge, ipcRenderer } = require('electron');
// 暴露安全的IPC接口给渲染进程(仅允许必要操作)
contextBridge.exposeInMainWorld('electronAPI', {
// 插入数据
dbInsert: (table, data) => ipcRenderer.invoke('db-insert', table, data),
// 查询所有数据
dbQueryAll: (table) => ipcRenderer.invoke('db-query-all', table)
});
4. 渲染进程(index.html):UI 交互 + 调用数据库

渲染进程负责用户交互(输入数据、触发操作),通过预加载暴露的接口调用主进程的数据库逻辑。

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Electron数据库示例</title></head><body><h1>用户管理</h1><!-- 插入数据表单 --><div><input type="text" id="name" placeholder="姓名"><input type="number" id="age" placeholder="年龄"><button onclick="addUser()">添加用户</button></div><!-- 数据展示 --><div><h3>用户列表</h3><ul id="userList"></ul></div><script>// 调用预加载暴露的APIconst { electronAPI } = window;// 添加用户(写入数据库)async function addUser() {const name = document.getElementById('name').value;const age = document.getElementById('age').value;if (!name || !age) return alert('请输入姓名和年龄');try {const result = await electronAPI.dbInsert('users', { name, age: Number(age) });alert(`添加成功!ID: ${result.id}`);loadUsers(); // 刷新列表} catch (err) {alert(`添加失败:${err.message}`);}}// 加载用户(读取数据库)async function loadUsers() {try {const users = await electronAPI.dbQueryAll('users');const list = document.getElementById('userList');list.innerHTML = users.map(u => `<li>${u.id}: ${u.name} (${u.age}岁)</li>`).join('');} catch (err) {alert(`查询失败:${err.message}`);}}// 页面加载时初始化列表window.onload = loadUsers;</script></body></html>

三、运行与测试

package.json中添加启动脚本:

"scripts": {
"start": "electron .",
"rebuild": "electron-rebuild -f -w sqlite3"
}

执行npm start即可启动应用,测试添加用户和查询功能。

四、其他数据库适配思路

1. MySQL/PostgreSQL
2. 关键注意事项
  • 安全性:数据库凭证(如 MySQL 密码)不要硬编码,可加密存储在本地配置文件。
  • 路径处理:本地数据库文件(如 SQLite)优先使用app.getPath('userData')(用户数据目录),避免权限问题。
  • 错误处理:所有数据库操作需捕获错误并返回给渲染进程,避免应用崩溃。

通过以上方案,可在 Electron 中实现安全、稳定的数据库读写功能,适配本地或远程数据库场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/979221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年四川石膏板公司推荐:成都鑫瑞凯越建材有限公司领衔前十榜单

摘要 四川石膏板行业近年来随着建筑业的快速发展而持续增长,2025年预计市场规模将达到50亿元,年复合增长率约8%。石膏板因其轻质、防火、环保等特性,广泛应用于住宅、商业和工业建筑。本榜单基于市场调研、用户口碑…

2025年四川石膏板工厂排行:口碑前十强推荐指南

摘要 四川石膏板行业在2025年持续发展,得益于建筑装修市场的增长,口碑好的石膏板厂家成为采购焦点。本文基于行业数据和用户评价,整理出口碑前十的四川石膏板工厂排名,为读者提供参考。摘要部分旨在帮助用户快速了…

2025 武汉高三一对一辅导学校权威推荐榜单!

高三阶段是文化课提分的关键窗口期,选择合规、专业的辅导机构对升学结果至关重要。本次榜单基于武汉市教育局 2024-2025 年度办学资质公示、第三方学情调研数据(来源:湖北省教育科学研究院学情监测平台)及机构教学…

keepalive HA + docker + nginx 实战

keepalive HA + docker + nginx 实战虚拟机桥接模式,独立ip和网卡IP 角色192.168.0.107 master192.168.0.111 slave配置虚拟机网卡静态ip TYPE="Ethernet" …

PyTorch2 Python深度学习 - 简介以及入门 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年下半年跳汰机供应商综合推荐与选购指南

摘要 随着矿业和选矿行业的快速发展,跳汰机作为重要的分选设备,在2025年下半年市场需求持续增长。本文基于行业调研和用户反馈,整理了十家值得关注的跳汰机供应商信息,排名不分先后,仅供采购参考。特别说明:本推…

2025年下半年破碎机制造厂推荐排行榜单全面解析

摘要 2025年下半年,破碎机制造行业持续发展,技术创新和市场需求推动品牌竞争加剧。本文提供一份推荐前10的破碎机制造厂榜单(排名不分先后),基于行业数据、用户口碑和综合性能评估编制,旨在为采购决策提供参考。…

2025年十大免费SCADA系统公司排行榜,国产开源的SCA

为帮工业企业高效锁定适配自身需求的SCADA系统合作伙伴,避免选型走弯路,我们从协议兼容性(如多品牌设备接入能力)、数据处理性能(含实时采集速度、历史数据存储效率)、安全防护体系(覆盖权限管理、协议加密)、…

2025年度十大5.0T路虎发动机源头厂家推荐,正规306P

在汽车后市场,发动机作为车辆的心脏,其品质直接决定车辆性能与运营成本。尤其对于路虎车主、汽修厂及车队运营商而言,5.0T路虎发动机与306PS路虎发动机的选型不仅关乎车辆耐用性,更涉及合规性与售后保障。面对市场…

读社会工程:防范钓鱼欺诈(卷3)04工具包

读社会工程:防范钓鱼欺诈(卷3)04工具包1. 情绪和政策 1.1. 你需要关注你的员工,考虑他们的感受,以及他们会对你的钓鱼攻击有何反应 1.2. 体谅每个人的感受优先于教学需要是很糟糕的,因为它会限制你开展教学环节 …

2025年中国十大快餐加盟品牌企业推荐:服务不错、诚信、实力

本榜单依托餐饮加盟全维度市场调研与真实创业者口碑反馈,深度筛选出十家标杆企业,为中小创业者选型提供客观依据,助力精准匹配适配的快餐加盟伙伴。 TOP1 推荐:成都隆广顺品牌管理有限公司 推荐指数:★★★★★ 口…

2025年航空发动机维修与正规原厂发动机生产厂家十大推荐

在航空运输与制造领域,航空发动机的性能与可靠性直接决定着运营安全与成本效率。无论是航空公司、维修企业还是整机制造商,都需要找到技术过硬、合规可靠的航空发动机维修服务商与正规原厂发动机生产厂家。以下依据技…

MAF快速入门(3)聊天记录持久化到数据库

上一篇,我们学习了MAF对于单个Agent的花样玩法,其中提到了聊天记录的持久化存储。本篇,我们来继续实践一下将聊天记录持久化到关系型数据库,这样用户在中断会话后返回时还能从上次断开的地方继续对话,提供给用户不…

2025年十大再制造6.0T W12奥迪发动机厂家排行榜,E

为帮汽修厂、车队运营商及车主高效锁定适配需求的再制造奥迪发动机供应商,避免因渠道不正规、质量无保障导致的售后纠纷与成本浪费,我们从品质合规性(如再制造管理体系认证、核心部件修复工艺)、技术匹配能力(车型…

2025年国产发动机厂家年度排名:专业的国产发动机源头厂家有

本榜单基于全维度市场调研与真实行业口碑,深度筛选出五家标杆国产发动机厂家,为企业选型提供客观依据,助力精准匹配适配的供应伙伴。 TOP1 推荐:香河乐辉汽车配件制造有限公司 推荐指数:★★★★★ 口碑评分:国内…

2025年三大EA888奥迪发动机厂家排行榜,再制造EA21

为帮助汽修厂、车队运营商及车主高效锁定适配的EA888、EA211奥迪发动机供应商,避开价格虚高、质量无保障、服务断层的选型坑,我们从合规资质(含再制造认证、进口报关文件)、技术工艺(核心部件修复标准、检测流程)…

2025靠谱的EN01国产发动机厂家:甄选高性价比工厂助力动

随着商用车、工程机械领域对国产发动机的需求激增,2024年国内EN01发动机市场规模突破30亿元,年增速达38%。但行业乱象频发:32%的客户投诉集中在质量不稳定、适配性差、售后缺失三大问题——部分小厂产品未通过合规认…

【GitHub每日速递 20251128】Milvus向量数据库:高性能、多特性,助力AI应用开发新潮流!

原文: https://mp.weixin.qq.com/s/v3qLPwurhCtk7cJUzjN8tQ Milvus向量数据库:高性能、多特性,助力AI应用开发新潮流! milvus 是一个高性能、云原生的向量数据库,专为可扩展的近似最近邻(ANN)搜索设计。简单讲,…

2025年热门的制药高低温一体机厂家选购指南与推荐

2025年热门的制药高低温一体机厂家选购指南与推荐行业背景与市场趋势随着全球制药行业的快速发展,对药品生产过程中的温度控制要求日益严格。高低温一体机作为制药生产中的关键设备,其市场需求呈现持续增长态势。根据…

深入解析:开源自动驾驶平台全景:超越Autoware和Apollo

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …