在SQLite表中插入多行的最佳方法是什么

mrfwxfqh  于 2022-12-13  发布在  SQLite
关注(0)|答案(1)|浏览(180)

我的问题主要与性能相关,我在主ElectronJS进程上运行了以下代码:

ipcMain.handle('add_product', async (event, args)=>{
       return new Promise((resolve, reject)=>{
            try {
                if(Array.isArray(args)){
                    args.forEach(prod =>{
                        const {name,barcode,stock,price,buy_price,image,alert} = prod
                        const stmt = db.prepare("INSERT INTO products VALUES (?,?,?,?,?,?,?)")
                        stmt.run(name, barcode, stock, alert, price, buy_price, image)
                        stmt.finalize()
                    })
                    resolve({text : `${args.length} product have been added to database!`})
                }else{
                    // This code execute's only when adding a single product
                    // It is not relevant to the question
                    const {name,barcode,stock,price,buy_price,image,alert} = args
                    const stmt = db.prepare("INSERT INTO products VALUES (?,?,?,?,?,?,?)")
                    stmt.run(name, barcode, stock, alert, price, buy_price, image)
                    stmt.finalize()
                    resolve({text : `Product '${name}' have been saved!`})
                }                 
            }catch (error){
                reject(error)
            }
        })   
    })

它接收一个对象数组,每个对象包含一个产品详细信息。现在,上面的代码可以工作了,并成功地将行插入到数据库中。但是,当使用大量数据样本(超过5000个产品)测试它时,整个应用程序在将行保存到数据库中时冻结了几秒钟,然后才重新响应。

开发堆栈为:

  • 电子JS
  • ReactJS(将其用于VIEW)
  • SQLite数据库
    什么是使应用程序运行得更胖的最佳性能驱动方式?
cvxl0en2

cvxl0en21#

好吧,我用公式表示查询的方式是它将运行5000次--每个产品一次--这大大降低了整个应用程序的速度。
我将代码更改为:

ipcMain.handle('add_product', async (event, args)=>{
       return new Promise((resolve, reject)=>{
            try {
                if(Array.isArray(args)){
                    let sql = `INSERT INTO products VALUES`
                    args.forEach((prod, i) =>{
                        const {name,barcode,price,buy_price,stock,alert,image} = prod 
                        if(i === args.length - 1){
                            sql += `('${name}','${barcode}','${price}','${buy_price}','${stock}','${alert}','${image}')`
                        }else{
                            sql += `('${name}','${barcode}','${price}','${buy_price}','${stock}','${alert}','${image}'),`
                        }
                    })
                    db.exec(sql, (error)=>{
                        if(error){
                            reject(error)
                        }else{
                            resolve({text : `${args.length} product have been added to database!`})
                        }
                    })
                }else{
                    const {name,barcode,price,buy_price,stock,alert,image} = args
                    const stmt = db.prepare("INSERT INTO products VALUES (?,?,?,?,?,?,?)")
                    stmt.run(name, barcode, stock, alert, price, buy_price, image)
                    stmt.finalize()
                    resolve({text : `Product '${name}' have been saved!`})
                }                 
            }catch (error){
                reject(error)
            }
        })   
    })

现在,查询只运行一次(以异步方式运行,以避免阻塞UI),但可以运行所有产品,而且速度快得多。

相关问题