electron使用sqlite

使用sql.js和sqlite3两种插件操作sqlite数据库的工具方法。

新建sqlitedb.js文件,内容如下:

export default {
    db: {},
    prod:''
}

公共基础方法:

    initDb(){
        sqlitedb.db=this.connectDb(tableName)
    },
    //适配db实例
    dbInstance(){
        if(!sqlitedb.db){
            this.initDb()
        }
        return sqlitedb.db
    },
    dbAdapter(dbFilePath){
        let writeFileFlag=window.localStorage.getItem('writeFileFlag')
        console.log('writeFileFlag',writeFileFlag)
        if(writeFileFlag!='1'){
            fileUtil.writeFileHandle(dbFilePath)
        }
    },
    connectDb(table) {
        if(process.env.NODE_ENV === 'production'){
            // 获取安装目录(也就是文件安装目录中exe文件的目录)
            let homeDir =  path.dirname(app.getPath('exe'))
            sqlitedb.prod=homeDir+"\\"+table+".db"
            this.dbAdapter(sqlitedb.prod)
        }else{
            sqlitedb.prod="static/db/"+table+".db"
        }
        let dbt=null
        if(packageName=='sqljs'){
            dbt=sqljsUtil.dbInit(sqlitedb.prod)
        }else{
            dbt=sqlite3Util.dbInit(sqlitedb.prod)
        }
        return dbt
    },

 fileUtil内容:

    writeFileHandle(dbFilePath){
        if(!fs.existsSync(dbFilePath)){
            window.localStorage.setItem('writeFileFlag','1')
            fs.closeSync(fs.openSync(dbFilePath, 'w'))
        }
    },

sql.js封装工具

import fileUtil from "../file/fileUtil";
import fs from "fs";
import sqlitedb from "./sqlitedb";
const sqlite3=require("sql.js")

export default {
    async dbInit(prod) {
        try {
            let fileBuffer = fs.readFileSync(prod);
            await sqlite3().then(SQL => {
                sqlitedb.db = new SQL.Database(fileBuffer);
            })
        }catch (e) {
            fileUtil.writeFileHandle(prod)
            let fileBuffer = fs.readFileSync(prod);
            await sqlite3().then(SQL => {
                sqlitedb.db = new SQL.Database(fileBuffer);
            })
        }
        return sqlitedb.db
    },
    createTable(dbInstance,table,field,callback) {
        let sql = 'create table if not exists '+table+' ('+field+')';
        console.log(sql)
        dbInstance.run(sql);
        this.commitDb(dbInstance)
        callback()
    },
    inertData(dbInstance,table,field,data) {
        for(let i=0;i<data.length;i++){
            let sql = 'insert into '+table+' ('+field+') values ('+data[i]+')';
            this.inertDataSql(dbInstance,sql)
        }
        this.commitDb(dbInstance)
    },
    inertDataSql(dbInstance,sql) {
        console.log(sql)
        dbInstance.run(sql);
    },
    updateDataSql(dbInstance,sql,callback) {
        console.log(sql)
        dbInstance.run(sql);
        this.commitDb(dbInstance)
        callback()
    },
    del(dbInstance,table,name,callback) {
        let sql = ''
        if(name){
            sql='delete from '+table+' where name = '+name;
        }else{
            sql='delete from '+table;
        }
        dbInstance.run(sql)
        this.commitDb(dbInstance)
        callback()
    },
    delById(dbInstance,table,id,callback) {
        let sql ='delete from '+table+' where id = '+id;
        console.log(sql)
        dbInstance.run(sql);
        this.commitDb(dbInstance)
        callback()
    },
    clearTable(dbInstance,table,callback) {
        let sql ='delete from '+table;
        console.log(sql)
        dbInstance.run(sql);
        this.commitDb(dbInstance)
        callback()
    },
    dropTable(dbInstance,table,callback) {
        let sql = 'DROP TABLE IF EXISTS '+table
        dbInstance.run(sql)
        this.commitDb(dbInstance)
        callback()
    },
    ifTableExists(dbInstance,table,callback) {
        let sql = 'select name from '+table
        let res=dbInstance.exec(sql)
        callback(res)
    },

    queryList(dbInstance,table,key,param,callback) {
        let sql = 'select * from '+table
        if(param){
            sql+=" where "+key+" like '%"+param+"%'"
        }
        console.log(sql)
        let res=dbInstance.exec(sql)
        callback(res)
    },
    queryListPage(dbInstance,table,page,param,callback) {
        let sql = 'select * from '+table
        if(param){
            sql+=" where name like '%"+param+"%'"
        }
        if(page&&page.size!=0){
            sql+=' LIMIT '+page.size +' OFFSET '+ ((page.num-1) * page.size)
        }
        console.log(sql)
        let res=dbInstance.exec(sql)
        callback(res)
    },
    queryCount(dbInstance,table,param,callback) {
        let sql = 'select count(1) as total from '+table
        if(param){
            sql+=" where name like '%"+param+"%'"
        }
        console.log(sql)
        let res=dbInstance.exec(sql)
        callback(res.length||0)
    },
    closeDb(dbInstance){
        //使用全局引用,打开不关闭
        //  dbInstance.close();
    },
    getById(dbInstance,table,id,callback) {
        let sql = 'select * from '+table+' where id='+id
        let res=dbInstance.exec(sql)
        callback(res)
    },
    ifTableCreate(dbInstance,table,field,callback) {
        this.createTable(dbInstance, table, field, ()=>{
            callback()
        })
    },
    queryListBySql(dbInstance,sql,callback){
        let res=dbInstance.exec(sql)
        callback(res)
    },
    //需要提交到db中
    commitDb(dbInstance){
        let data = dbInstance.export();
        let buffer = Buffer.from(data, 'binary');
        fs.writeFileSync(sqlitedb.prod, buffer);
    }

}

sqlite3封装工具

import fileUtil from "../file/fileUtil";
const sqlite3 = require("sqlite3").verbose();

export default {
    dbInit(prod) {
        let dbt=null
        try {
            dbt=new sqlite3.Database(prod)
        }catch (e) {
            fileUtil.writeFileHandle(prod)
            dbt=new sqlite3.Database(prod)
        }
        return dbt
    },
    async createTable(dbInstance,table,field,callback) {
        let sql = 'create table if not exists '+table+' ('+field+')';
        console.log(sql)
        await dbInstance.all(sql,(err, rows)=>{
            if(err){
                return err
            }
            callback()
        });
    },
    inertData(dbInstance,table,field,data) {
        for(let i=0;i<data.length;i++){
            let sql = 'insert into '+table+' ('+field+') values ('+data[i]+')';
            this.inertDataSql(dbInstance,sql,()=>{})
        }
    },
    async inertDataSql(dbInstance,sql,callback) {
        console.log(sql)
        await dbInstance.all(sql,(err, rows)=>{
            if(err){
                console.log(err)
                return
            }
            callback()
        });
    },
    async updateDataSql(dbInstance,sql,callback) {
        console.log(sql)
        await dbInstance.all(sql,(err, rows)=>{
            callback(err)
        });
    },
    async del(dbInstance,table,name,callback) {
        let sql = ''
        if(name){
            sql='delete from '+table+' where name = '+name;
        }else{
            sql='delete from '+table;
        }
        await dbInstance.all(sql,(err, rows)=>{
            if(err){
                console.log(err)
                return err
            }
            callback()
        });
    },
    async delById(dbInstance,table,id,callback) {
        let sql ='delete from '+table+' where id = '+id;
        console.log(sql)
        await dbInstance.all(sql,(err, rows)=>{
            if(err){
                return err
            }
            callback()
        });
    },
    async clearTable(dbInstance,table,callback) {
        let sql ='delete from '+table;
        console.log(sql)
        await dbInstance.all(sql,(err, rows)=>{
            if(err){
                return err
            }
            callback()
        });
    },
    async dropTable(dbInstance,table,callback) {
        let sql = 'DROP TABLE IF EXISTS '+table
        await dbInstance.all(sql,(err, rows)=>{
            if(err){
                return err
            }
            callback()
        });
    },
    async ifTableExists(dbInstance,table,callback) {
        let sql = 'select name from '+table
        await dbInstance.all(sql, (err, rows) => {
            if(err){
                return
            }
            callback(rows)
        });
    },

    async queryList(dbInstance,table,key,param,callback) {
        let sql = 'select * from '+table
        if(param){
            sql+=" where "+key+" like '%"+param+"%'"
        }
        console.log(sql)
        await dbInstance.all(sql, (err, rows) => {
            if(err){
                callback([])
                return
            }
            callback(rows)
        });
    },
    async queryListPage(dbInstance,table,page,param,callback) {
        let sql = 'select * from '+table
        if(param){
            sql+=" where name like '%"+param+"%'"
        }
        if(page&&page.size!=0){
            sql+=' LIMIT '+page.size +' OFFSET '+ ((page.num-1) * page.size)
        }
        console.log(sql)
        await dbInstance.all(sql, (err, rows) => {
            if(err){
                console.log(err)
                return
            }
            callback(rows)
        });
    },
    async queryCount(dbInstance,table,param,callback) {
        let sql = 'select count(1) as total from '+table
        if(param){
            sql+=" where name like '%"+param+"%'"
        }
        console.log(sql)
        await dbInstance.all(sql, (err, total) => {
            if(err){
                console.log(err)
                return
            }
            callback(total[0].total||0)
        });
    },
    async closeDb(dbInstance){
        //使用全局引用,打开不关闭
        // await dbInstance.close();
    },
    async getById(dbInstance,table,id,callback) {
        let sql = 'select * from '+table+' where id='+id
        await dbInstance.all(sql, (err, rows) => {
            if(err){
                console.log(err)
                return
            }
            callback(rows)
        });
    },
    ifTableCreate(dbInstance,table,field,callback) {
        this.createTable(dbInstance, table, field, ()=>{
            callback()
        })
    },
    async queryListBySql(dbInstance,sql,callback){
        await dbInstance.all(sql, (err, rows) => {
            if(err){
                console.log(err)
                return
            }
            callback(rows)
        });
    }
}

两个插件都可以很好的操作sqlite,不同在于使用electron-builder编译打包时,如果项目中依赖了sqlite3插件,他会主动再去下载sqlite3的5.1.7版本,但是会遇到下载sqlite3-v5.1.7-napi-v36-win32-x64.tar.gz的包下载不下来,因为是sqlite3-v5.1.7-napi-v3-win32-x64.tar.gz和sqlite3-v5.1.7-napi-v6-win32-x64.tar.gz两种包,这里没有找到太好的解决方法,所以可以使用sql.js来替代sqlite3;也可以使用electron-packager打包插件来替代electron-builder来打包,这样就可以使用sqlite3了。

好的,下面是一个使用 Vite、TypeScript 和 ElectronSQLite3 示例项目。 首先,需要安装以下依赖: - vite - electron - electron-builder(可选,用于将应用程序打包成可执行文件) - sqlite3 - @types/sqlite3(TypeScript 定义文件) 可以使用以下命令进行安装: ``` npm install vite electron electron-builder sqlite3 @types/sqlite3 --save-dev ``` 接下来,创建一个 Vite 项目: ``` npx vite create my-app --template electron-ts ``` 然后,在项目根目录下创建一个 `db` 目录,用于存放 SQLite3 数据库文件。 接着,创建一个 `database.ts` 文件,用于连接 SQLite3 数据库: ```typescript import sqlite3 from 'sqlite3'; const DB_PATH = './db/my-db.db'; export function connectDatabase() { return new sqlite3.Database(DB_PATH, (err) => { if (err) { console.error(err.message); } console.log('Connected to the database.'); }); } ``` 这个文件中,我们首先定义了 SQLite3 数据库文件的路径 `DB_PATH`,然后导出了一个 `connectDatabase` 函数,用于连接到数据库。 接下来,我们可以创建一个 `users.ts` 文件,用于操作用户表: ```typescript import { connectDatabase } from './database'; const db = connectDatabase(); export interface User { id: number; name: string; email: string; } export function getAllUsers(): Promise<User[]> { return new Promise((resolve, reject) => { db.all('SELECT * FROM users', (err, rows) => { if (err) { reject(err); } else { resolve(rows); } }); }); } export function addUser(user: User): Promise<number> { return new Promise((resolve, reject) => { db.run( 'INSERT INTO users(name, email) VALUES(?, ?)', [user.name, user.email], function (err) { if (err) { reject(err); } else { resolve(this.lastID); } } ); }); } ``` 在这个文件中,我们首先导入了 `connectDatabase` 函数,并使用它连接到了数据库。然后,我们定义了一个 `User` 接口,用于表示用户的数据结构。 接着,我们导出了两个函数: - `getAllUsers`:用于获取所有用户记录。 - `addUser`:用于添加一条新的用户记录。 这两个函数都是返回 Promise 对象的,因为它们都是需要异步执行的操作。 最后,我们可以在 `renderer.ts` 文件中调用这些函数: ```typescript import { getAllUsers, addUser, User } from './users'; const userList = document.querySelector('#user-list')!; const nameInput = document.querySelector('#name-input') as HTMLInputElement; const emailInput = document.querySelector('#email-input') as HTMLInputElement; const addBtn = document.querySelector('#add-btn')!; async function loadUsers() { const users = await getAllUsers(); userList.innerHTML = ''; users.forEach((user) => { const li = document.createElement('li'); li.textContent = `${user.id} - ${user.name} (${user.email})`; userList.appendChild(li); }); } addBtn.addEventListener('click', async () => { const user: User = { id: 0, name: nameInput.value, email: emailInput.value, }; await addUser(user); await loadUsers(); }); loadUsers(); ``` 在这个文件中,我们首先导入了 `getAllUsers` 和 `addUser` 函数,以及 `User` 接口。 然后,我们使用 DOM API 获取了一些元素,包括用户列表、姓名输入框、邮箱输入框和添加按钮。 接着,我们定义了一个 `loadUsers` 函数,用于加载所有用户记录,并将它们显示在用户列表中。 最后,我们在添加按钮的点击事件处理程序中,获取了用户输入的姓名和邮箱,创建了一个新的用户对象,并调用了 `addUser` 函数将其添加到数据库中。然后,我们又调用了 `loadUsers` 函数重新加载用户列表。 现在,可以使用以下命令启动应用程序: ``` npm run dev ``` 这将同时启动 Vite 和 Electron,打开应用程序窗口。 在窗口中,可以输入用户的姓名和邮箱,点击添加按钮,然后应该会在用户列表中看到新添加的用户记录。 最后,如果想要将应用程序打包成可执行文件,可以使用以下命令: ``` npm run build ``` 这将使用 Electron Builder 将应用程序打包成可执行文件,并输出到 `dist` 目录中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暮雪...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值