SQLite UPDATE操作无效果:数据库条目拆分后原行未更新
问题排查与修复
核心问题:条件判断逻辑错误
你当前的条件row.francais.search("/") != 0无法正确筛选出包含‘/’的条目:
- 当字符串里没有‘/’时,
search("/")返回-1,-1 != 0成立,会进入不必要的逻辑(但此时split后数组只有一个元素,更新内容和原内容一致,所以数据库无变化) - 当字符串以‘/’开头时,
search("/")返回0,条件不成立,会跳过本该处理的条目
正确的条件应该是判断字符串确实包含‘/’,用includes或者search !== -1均可。
修正后的代码
async function mutator(id, french, pierrick){ return new Promise((resolve, reject) => { const sql = "UPDATE dictionnaire SET francais = ?, pierrick = ? WHERE id = ?"; db.run(sql, [french, pierrick, id], (err) => { if (err) { console.log(err); reject(err); } else { // db.run的回调没有row参数,直接resolve即可 resolve(); } }); }); } // 修正条件判断 if (row.francais != null && row.francais.includes("/")) { let synonyms = row.francais.split("/"); await mutator(row.id, synonyms[0], row.pierrick); for (let i = 1; i < synonyms.length; i++) { await setter(row, synonyms[i], row.pierrick); } }
额外优化说明
mutator函数里的Promise不需要用async包裹,内部没有await操作,直接用普通函数即可db.run的回调本身没有row参数,原来的resolve(row)会返回undefined,直接resolve()更合理
内容的提问来源于stack exchange,提问作者Awing
相关产品推荐
相关产品推荐

