在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)
})
posted @ 2025-01-04 23:24  小枫同学  阅读(1237)  评论(0)    收藏  举报