fix: v0.7.3 数据正确性与边界窗口收尾 — INSERT 语句级原子(三引擎+Aria PK 批内重复)/ 索引列 IS NULL 恒空 / delete RESTRICT 破坏索引 / queryStream 子查询静默空结果 / ALTER DROP 索引残留 / UNIQUE INDEX 存量校验 / SELECT * 别名投影 / WAL BEGIN/ROLLBACK 事务边界 / aria $in 与级联重复扫描性能 / $and 等值下推 / ANALYZE 索引统计 / React-Vue hooks 生命周期 / 迁移主键兜底 + 58 回归
This commit is contained in:
+18
-4
@@ -49,14 +49,22 @@ function inferFieldType(value: unknown): FieldType {
|
||||
}
|
||||
|
||||
/** 从样例行推断 schema(旧库无持久化 schema 时回退) */
|
||||
function inferSchema(tableName: string, rows: Record<string, unknown>[]): TableSchema {
|
||||
function inferSchema(tableName: string, rows: Record<string, unknown>[]): TableSchema | null {
|
||||
const columns: Record<string, ColumnDef> = {};
|
||||
if (rows.length === 0) return { name: tableName, columns };
|
||||
const first = rows[0];
|
||||
for (const key of Object.keys(first)) {
|
||||
const keys = Object.keys(first);
|
||||
// v0.7.3: 主键推断 —— 优先 id;无 id 列时取第一个非 json 类型列(json 列
|
||||
// String() 化为 "[object Object]" 会致所有行主键冲突)。全 json 列无可用
|
||||
// 主键 → 返回 null(调用方跳过该表),此前直接抛 SCHEMA_ERROR 中断整个迁移。
|
||||
const pkKey = keys.includes('id')
|
||||
? 'id'
|
||||
: keys.find((k) => inferFieldType(first[k]) !== 'json');
|
||||
if (!pkKey) return null;
|
||||
for (const key of keys) {
|
||||
columns[key] = {
|
||||
type: inferFieldType(first[key]),
|
||||
primaryKey: key === 'id',
|
||||
primaryKey: key === pkKey,
|
||||
};
|
||||
}
|
||||
return { name: tableName, columns };
|
||||
@@ -151,7 +159,13 @@ export async function migrateFromIndexedDB(opts: MigrationOptions): Promise<Migr
|
||||
result.skippedTables.push(tableName);
|
||||
continue;
|
||||
}
|
||||
schema = inferSchema(tableName, rows);
|
||||
const inferred = inferSchema(tableName, rows);
|
||||
// v0.7.3: 全 json 列推断无主键 → 跳过该表(此前抛 SCHEMA_ERROR 中断迁移)
|
||||
if (!inferred) {
|
||||
result.skippedTables.push(tableName);
|
||||
continue;
|
||||
}
|
||||
schema = inferred;
|
||||
}
|
||||
|
||||
// 写入目标引擎
|
||||
|
||||
Reference in New Issue
Block a user