From 474b2bc6ce61aa1d9e4bd84793a1f72f65baa229 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Sat, 27 Jun 2026 15:54:00 +0800 Subject: [PATCH] fix(dameng): defer table metadata refresh --- apps/desktop/src/components/sidebar/TreeItem.vue | 8 ++++++-- apps/desktop/src/composables/useNavigationTargets.ts | 12 +++++------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/apps/desktop/src/components/sidebar/TreeItem.vue b/apps/desktop/src/components/sidebar/TreeItem.vue index f03ff4593..3a6178519 100644 --- a/apps/desktop/src/components/sidebar/TreeItem.vue +++ b/apps/desktop/src/components/sidebar/TreeItem.vue @@ -1057,6 +1057,7 @@ async function openData() { console.warn("[DBX][openData:metadata:error]", { traceId, tabId, elapsed: elapsed(), error }); } }; + const shouldRefreshTableMeta = !cachedTableMeta; if (cachedTableMeta) { console.info("[DBX][openData:metadata:cache-hit]", { traceId, @@ -1067,8 +1068,7 @@ async function openData() { elapsed: elapsed(), }); } else { - void refreshTableMetaInBackground(); - logPhase("metadata-started", { tabId }); + logPhase("metadata-deferred", { tabId }); } // Check if superseded by a newer openData call @@ -1105,6 +1105,10 @@ async function openData() { await queryStore.executeTabSql(tabId, sql, { sourceTraceId: traceId, skipEnsureConnected: true }); console.info("[DBX][openData:execute:done]", { traceId, tabId, elapsed: elapsed() }); logPhase("execute-tab-sql", { tabId }); + if (shouldRefreshTableMeta && isCurrentDataTab()) { + void refreshTableMetaInBackground(); + logPhase("metadata-started", { tabId }); + } } catch (e: any) { if (!isActive()) { logPhase("superseded-after-error", { tabId }); diff --git a/apps/desktop/src/composables/useNavigationTargets.ts b/apps/desktop/src/composables/useNavigationTargets.ts index 3f08842e9..90b1f9170 100644 --- a/apps/desktop/src/composables/useNavigationTargets.ts +++ b/apps/desktop/src/composables/useNavigationTargets.ts @@ -91,11 +91,9 @@ async function openTableTarget(target: NavigationTarget, options: { tableInfoTab columns: [], primaryKeys: [], }); - const columnsPromise = api.getColumns(target.connectionId, target.database, querySchema, target.tableName); - const dataPromise = queryStore.executeTabSql(tabId, sql); - const [columnsResult, dataResult] = await Promise.allSettled([columnsPromise, dataPromise]); - if (columnsResult.status === "fulfilled") { - const columns = columnsResult.value; + await queryStore.executeTabSql(tabId, sql); + try { + const columns = await api.getColumns(target.connectionId, target.database, querySchema, target.tableName); const indexes = await api.listIndexes(target.connectionId, target.database, querySchema, target.tableName).catch(() => []); const primaryKeys = editableRowIdentifierColumns(effectiveDbType, columns, indexes); const useRowId = usesSyntheticRowIdKey(effectiveDbType, primaryKeys); @@ -120,9 +118,9 @@ async function openTableTarget(target: NavigationTarget, options: { tableInfoTab queryStore.updateSql(tabId, newSql); await queryStore.executeTabSql(tabId, newSql); } + } catch (reason) { + console.error("[DBX] ERROR fetching table metadata:", reason); } - if (dataResult.status === "rejected") throw dataResult.reason; - if (columnsResult.status === "rejected") console.error("[DBX] ERROR fetching table metadata:", columnsResult.reason); } catch (e: any) { queryStore.setErrorResult(tabId, e); }