fix(db): 修复 sql.js lastInsertRowid 误当函数调用导致 userId=0 工作组写入失败
Deploy to Server / deploy (push) Successful in 1m36s
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:
+17
-6
@@ -31,8 +31,20 @@ function wrapStmt(db: Database & any, sql: string): StmtCompat {
|
|||||||
try {
|
try {
|
||||||
stmt.bind(bindArray(params));
|
stmt.bind(bindArray(params));
|
||||||
stmt.step();
|
stmt.step();
|
||||||
const changes = db.getRowsModified();
|
const changes = Number(db.getRowsModified?.() ?? db.rowsModified ?? 0);
|
||||||
const lastInsertRowid = (db as any).lastInsertRowid?.() ?? 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 };
|
return { changes, lastInsertRowid };
|
||||||
} finally {
|
} finally {
|
||||||
stmt.free();
|
stmt.free();
|
||||||
@@ -88,10 +100,7 @@ export async function initDb() {
|
|||||||
extended.prepareCompat = function (sql: string) { return wrapStmt(extended, sql); };
|
extended.prepareCompat = function (sql: string) { return wrapStmt(extended, sql); };
|
||||||
extended.execCompat = function (sql: string) { extended.exec(sql); };
|
extended.execCompat = function (sql: string) { extended.exec(sql); };
|
||||||
extended.pragmaCompat = function (expr: string) {
|
extended.pragmaCompat = function (expr: string) {
|
||||||
if (/foreign_keys\s*=\s*ON/i.test(expr)) {
|
try { extended.exec(`PRAGMA ${expr};`); } catch {}
|
||||||
// sql.js 默认开启 FK?尝试显式设置
|
|
||||||
try { extended.exec('PRAGMA foreign_keys = ON;'); } catch {}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
extended.save = function () {
|
extended.save = function () {
|
||||||
const data = extended.export();
|
const data = extended.export();
|
||||||
@@ -101,6 +110,8 @@ export async function initDb() {
|
|||||||
db = extended;
|
db = extended;
|
||||||
const d = extended;
|
const d = extended;
|
||||||
|
|
||||||
|
try { d.pragmaCompat('foreign_keys = ON'); } catch {}
|
||||||
|
|
||||||
const schemaPath = path.join(__dirname, 'schema.sql');
|
const schemaPath = path.join(__dirname, 'schema.sql');
|
||||||
const schema = fs.readFileSync(schemaPath, 'utf-8');
|
const schema = fs.readFileSync(schemaPath, 'utf-8');
|
||||||
try { d.execCompat(schema); d.save(); } catch (e) { console.error('Schema init error', e); }
|
try { d.execCompat(schema); d.save(); } catch (e) { console.error('Schema init error', e); }
|
||||||
|
|||||||
Reference in New Issue
Block a user