From 7f9bf15b7ddde0c31789d6743f2d6b4a9dfbf666 Mon Sep 17 00:00:00 2001 From: Trae Assistant Date: Mon, 5 Oct 2026 08:53:58 +0800 Subject: [PATCH] =?UTF-8?q?fix(db):=20=E4=BF=AE=E5=A4=8D=20sql.js=20lastIn?= =?UTF-8?q?sertRowid=20=E8=AF=AF=E5=BD=93=E5=87=BD=E6=95=B0=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E5=AF=BC=E8=87=B4=20userId=3D0=20=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E7=BB=84=E5=86=99=E5=85=A5=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - wrapStmt.run(): 原 lastInsertRowid?.() 误将属性当函数调用导致 undefined→0,现优先直接读取属性(number/bigint),其次调用函数,最后 SELECT 兜底 - initDb: 在 schema 执行前强制 PRAGMA foreign_keys = ON,修正 pragmaCompat 正则判断导致 FK 默认关闭 - pragmaCompat 改为通用 pragma 表达式执行,不再只匹配 foreign_keys=ON - 根因链条:lastInsertRowid() 调用失败→返回 0→user_groups(0,gid) 全部相同 PK→INSERT OR IGNORE changes=0→40 条数据工作组全 0 写入 - build 通过 --- server/src/db/index.ts | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/server/src/db/index.ts b/server/src/db/index.ts index 81135fe..da3dbe3 100644 --- a/server/src/db/index.ts +++ b/server/src/db/index.ts @@ -31,8 +31,20 @@ function wrapStmt(db: Database & any, sql: string): StmtCompat { try { stmt.bind(bindArray(params)); stmt.step(); - const changes = db.getRowsModified(); - const lastInsertRowid = (db as any).lastInsertRowid?.() ?? 0; + const changes = Number(db.getRowsModified?.() ?? db.rowsModified ?? 0); + let lastInsertRowid = 0; + try { + const prop = db.lastInsertRowid; + if (typeof prop === 'number') lastInsertRowid = prop; + else if (typeof prop === 'bigint') lastInsertRowid = Number(prop); + else if (typeof prop === 'function') lastInsertRowid = Number(prop() ?? 0); + } catch {} + if (lastInsertRowid === 0 && changes > 0) { + try { + const tmp = db.exec('SELECT last_insert_rowid() AS id'); + if (tmp && tmp[0] && tmp[0].values && tmp[0].values[0]) lastInsertRowid = Number(tmp[0].values[0][0]); + } catch {} + } return { changes, lastInsertRowid }; } finally { stmt.free(); @@ -88,10 +100,7 @@ export async function initDb() { extended.prepareCompat = function (sql: string) { return wrapStmt(extended, sql); }; extended.execCompat = function (sql: string) { extended.exec(sql); }; extended.pragmaCompat = function (expr: string) { - if (/foreign_keys\s*=\s*ON/i.test(expr)) { - // sql.js 默认开启 FK?尝试显式设置 - try { extended.exec('PRAGMA foreign_keys = ON;'); } catch {} - } + try { extended.exec(`PRAGMA ${expr};`); } catch {} }; extended.save = function () { const data = extended.export(); @@ -101,6 +110,8 @@ export async function initDb() { db = extended; const d = extended; + try { d.pragmaCompat('foreign_keys = ON'); } catch {} + const schemaPath = path.join(__dirname, 'schema.sql'); const schema = fs.readFileSync(schemaPath, 'utf-8'); try { d.execCompat(schema); d.save(); } catch (e) { console.error('Schema init error', e); }