在electron中使用sqlite
[!NOTE] 2025-01-05更新
直接看最下边更新版,这个版本不好用
一、安装
pnpm install knex better-sqlite3
还需要再执行
npx electron-rebuild -v
二、注册ICP
然后再主进程中:
//mian.js
const knex = require('knex');
const db = knex({
client: 'better-sqlite3',
connection: {
filename: path.join(__dirname, 'example.db'),
},
useNullAsDefault: true, // SQLite 推荐设置
});
ipcMain.handle('db-query', async (event, queryConfig) => {
try {
const { table, method, args } = queryConfig;
// 使用 Knex 查询构造器构建查询
const query = db(table)[method](...args);
// 执行查询并返回结果
const result = await query;
return result;
} catch (error) {
console.error('Database error:', error);
throw error;
}
});
三、在预加载脚本中注册
window.addEventListener('DOMContentLoaded', () => {
const { shell, contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('Electron', {
dbQuery: async (sql) => ipcRenderer.invoke('db-query', sql),
})
})
四、在渲染层中使用
window.Electron.dbQuery({
table: 'user',
method: 'select',
args: ['*']
}).then(res => {
console.log(res)
})
2025-01-05更新
main.js
const Database = require('better-sqlite3'); // 需要先引入数据库实例
const db = new Database('example.db'); // 创建数据库实例
ipcMain.handle('db-exec', (event, sqlBricks) => {
try {
const { text, values } = sqlBricks;
log.info(text, values);
// 准备 SQL 语句
const stmt = db.prepare(text);
// 判断 SQL 类型,自动选择执行方法
if (/^select/i.test(text)) {
// SELECT 查询,使用 all() 获取所有行
const results = stmt.all(values);
return results;
} else if (/^(insert|update|delete)/i.test(text)) {
// INSERT, UPDATE, DELETE 操作,使用 run() 执行
const result = stmt.run(values);
return { changes: result.changes, lastInsertRowid: result.lastInsertRowid }; // 返回影响的行数或插入的 ID
} else {
throw new Error('Unsupported SQL type');
}
} catch (error) {
log.error(error);
console.error('Database error:', error);
throw error;
}
});
preload.js
dbExec: async (sqlBricks) => ipcRenderer.invoke('db-exec', sqlBricks),
.vue
pnpm install sql-bricks
const res = SqlBricks.select('*').from('user').where({ id: 1 }).where('user', 'admin').toParams({ placeholder: '?' })
console.log(res)
window.Electron.dbExec(res)
封装工具类
// database.js
// database.js
import SqlBricks from 'sql-bricks'
import sqlBricksSqlite from 'sql-bricks-sqlite'
function dbExec (sqlQuery) {
return new Promise((resolve, reject) => {
let sqlString = null
try {
sqlString = sqlQuery.toParams({ placeholder: '?' }) // 将 SqlBricks 对象转换为 SQL 字符串
} catch (_) {
sqlString = sqlQuery
}
// console.log(sqlString)
window.Electron.dbExec(sqlString)
.then((res) => resolve(res))
.catch((err) => reject(err))
})
}
// 封装工具函数
const custom = {
insertOrIgnore: (table, data) => {
const insertQuery = SqlBricks.insert(table, data) // 使用 sql-bricks 生成插入语句
const sql = insertQuery.toString() // 获取生成的 SQL 字符串
return sql.replace(/^INSERT INTO/i, 'INSERT OR IGNORE INTO') // 替换为 INSERT OR IGNORE INTO
},
/**
* 执行查询并返回结果
* @param {import('sql-bricks').SelectStatement} SelectStatement
* @returns
*/
async execute (SelectStatement) {
// console.log(SelectStatement)
try {
const result = await dbExec(SelectStatement)
return result
} catch (error) {
throw new Error(`Database execution failed: ${error.message}`)
}
}
}
const database = Object.assign(Object.create(SqlBricks), custom, sqlBricksSqlite)
export default database
使用工具类
import database from '@/utils/database'
const query = database.select('*').from('user').where({ id: 1 }).where('user', 'admin')
console.log(query)
database.execute(query).then(res => {
console.log(res)
})
本文来自博客园,作者:小枫同学,除网络转载的部分,其他版权属于作者和博客园所有,未经作者或博客园许可,禁止转载、复制、重新发布完整或者部分文字、代码、图片等信息,否则将保留追究法律责任的权利(如博客侵权了您的作品,本人再次表示抱歉,请将原创地址发送至下文邮箱,核实后立刻删除。)。查阅文章的同学,由于网络爬虫严重,有些代码并不会完整贴出来或者存在bug,不过你可以发送邮件到xfstune@126.com获取新代码,记得附上文章链接

浙公网安备 33010602011771号