fix(db): 修复 sql.js lastInsertRowid 误当函数调用导致 userId=0 工作组写入失败
Deploy to Server / deploy (push) Successful in 1m36s

- 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 通过
This commit is contained in:
Trae Assistant
2026-10-05 08:53:58 +08:00
parent 49985a96ab
commit 7f9bf15b7d
+17 -6
View File
@@ -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); }