diff --git a/frontend/src/components/Sidebar.tsx b/frontend/src/components/Sidebar.tsx
index fa7ed30..1ea3817 100644
--- a/frontend/src/components/Sidebar.tsx
+++ b/frontend/src/components/Sidebar.tsx
@@ -45,7 +45,7 @@ import { getTableDataDangerActionMeta, supportsTableTruncateAction, type TableDa
import { useAutoFetchVisibility } from '../utils/autoFetchVisibility';
import FindInDatabaseModal from './FindInDatabaseModal';
import { buildRpcConnectionConfig } from '../utils/connectionRpcConfig';
-import { normalizeSidebarViewName } from '../utils/sidebarMetadata';
+import { normalizeSidebarViewName, resolveSidebarRuntimeDatabase } from '../utils/sidebarMetadata';
const { Search } = Input;
@@ -1202,7 +1202,11 @@ const Sidebar: React.FC<{ onEditConnection?: (conn: SavedConnection) => void }>
routineEntries.forEach((entry) => getSchemaBucket(entry.schemaName).routines.push(buildRoutineNode(entry)));
triggerEntries.forEach((entry) => getSchemaBucket(entry.schemaName).triggers.push(buildTriggerNode(entry)));
+ const dialect = getMetadataDialect(conn as SavedConnection);
+ const isOracleLike = (dialect === 'oracle' || dialect === 'dm');
+
const schemaNodes: TreeNode[] = Array.from(schemaMap.values())
+ .filter((bucket) => !(isOracleLike && !bucket.schemaName))
.sort((a, b) => {
if (!a.schemaName && !b.schemaName) return 0;
if (!a.schemaName) return -1;
@@ -1210,8 +1214,8 @@ const Sidebar: React.FC<{ onEditConnection?: (conn: SavedConnection) => void }>
return a.schemaName.toLowerCase().localeCompare(b.schemaName.toLowerCase());
})
.map((bucket) => {
- const schemaNodeKey = `${key}-schema-${bucket.schemaName || 'default'}`;
- const schemaTitle = bucket.schemaName || '默认模式';
+ const schemaNodeKey = `${key}-schema-${bucket.schemaName || 'default'}`;
+ const schemaTitle = bucket.schemaName || '默认模式';
const groupedNodes: TreeNode[] = [
buildObjectGroup(schemaNodeKey, 'tables', '表', , bucket.tables, { schemaName: bucket.schemaName }),
buildObjectGroup(schemaNodeKey, 'views', '视图', , bucket.views, { schemaName: bucket.schemaName }),
@@ -2141,7 +2145,13 @@ const Sidebar: React.FC<{ onEditConnection?: (conn: SavedConnection) => void }>
const buildRuntimeConfig = (conn: any, overrideDatabase?: string, clearDatabase: boolean = false) => {
return buildRpcConnectionConfig(conn.config, {
- database: clearDatabase ? '' : ((overrideDatabase ?? conn.config.database) || ''),
+ database: resolveSidebarRuntimeDatabase(
+ conn?.config?.type,
+ conn?.config?.driver,
+ conn?.config?.database,
+ overrideDatabase,
+ clearDatabase,
+ ),
});
};
diff --git a/frontend/src/utils/sidebarMetadata.ts b/frontend/src/utils/sidebarMetadata.ts
index 81837a6..2b09cd6 100644
--- a/frontend/src/utils/sidebarMetadata.ts
+++ b/frontend/src/utils/sidebarMetadata.ts
@@ -11,6 +11,19 @@ const splitQualifiedName = (qualifiedName: string): { schemaName: string; object
};
};
+const normalizeSidebarConnectionDialect = (type: string, driver: string): string => {
+ const normalizedType = String(type || '').trim().toLowerCase();
+ if (normalizedType === 'custom') {
+ const normalizedDriver = String(driver || '').trim().toLowerCase();
+ if (normalizedDriver === 'postgresql' || normalizedDriver === 'postgres' || normalizedDriver === 'pg') return 'postgres';
+ if (normalizedDriver === 'dameng' || normalizedDriver === 'dm' || normalizedDriver === 'dm8') return 'dm';
+ if (normalizedDriver.includes('oracle')) return 'oracle';
+ return normalizedDriver;
+ }
+ if (normalizedType === 'dameng') return 'dm';
+ return normalizedType;
+};
+
export const normalizeSidebarViewName = (dialect: string, dbName: string, schemaName: string, viewName: string): string => {
const normalizedDialect = String(dialect || '').trim().toLowerCase();
const normalizedDbName = String(dbName || '').trim();
@@ -35,3 +48,26 @@ export const normalizeSidebarViewName = (dialect: string, dbName: string, schema
return `${normalizedSchemaName}.${normalizedViewName}`;
};
+
+export const resolveSidebarRuntimeDatabase = (
+ type: string,
+ driver: string,
+ savedDatabase: string,
+ overrideDatabase?: string,
+ clearDatabase: boolean = false,
+): string => {
+ if (clearDatabase) return '';
+
+ const normalizedSavedDatabase = String(savedDatabase || '').trim();
+ const normalizedOverrideDatabase = String(overrideDatabase || '').trim();
+ if (!normalizedOverrideDatabase) {
+ return normalizedSavedDatabase;
+ }
+
+ const dialect = normalizeSidebarConnectionDialect(type, driver);
+ if (dialect === 'oracle' || dialect === 'dm') {
+ return normalizedSavedDatabase || normalizedOverrideDatabase;
+ }
+
+ return normalizedOverrideDatabase;
+};