From bd83ee189b21d78d918aba0f4e840117b4c0f31b Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Wed, 12 Aug 2026 18:55:57 +0000 Subject: [PATCH] fix(generate): honor explicit unique value generation Refs: #5958 --- .../generate/DataGenerateDialog.vue | 65 ++++--- apps/desktop/src/i18n/locales/en.ts | 1 + apps/desktop/src/i18n/locales/es.ts | 1 + apps/desktop/src/i18n/locales/it.ts | 1 + apps/desktop/src/i18n/locales/ja.ts | 1 + apps/desktop/src/i18n/locales/ko.ts | 1 + apps/desktop/src/i18n/locales/pt-BR.ts | 1 + apps/desktop/src/i18n/locales/zh-CN.ts | 1 + apps/desktop/src/i18n/locales/zh-TW.ts | 1 + apps/desktop/src/lib/dataGrid/dataGenerate.ts | 46 ++++- packages/app-tests/dataGenerate.test.ts | 171 +++++++++++++++++- 11 files changed, 263 insertions(+), 27 deletions(-) diff --git a/apps/desktop/src/components/generate/DataGenerateDialog.vue b/apps/desktop/src/components/generate/DataGenerateDialog.vue index 759bc147af..ca9ee9a92b 100644 --- a/apps/desktop/src/components/generate/DataGenerateDialog.vue +++ b/apps/desktop/src/components/generate/DataGenerateDialog.vue @@ -4,7 +4,7 @@ import { useI18n } from "vue-i18n"; import { useConnectionStore } from "@/stores/connectionStore"; import * as api from "@/lib/backend/api"; import type { GenerateResult, TableGenerateConfig } from "@/lib/dataGrid/dataGenerate"; -import { displayGeneratedValue, findGeneratorKey, formatGeneratedValue, generateTableData, defaultGeneratorParams, supportsGeneratedMultiRowValues } from "@/lib/dataGrid/dataGenerate"; +import { displayGeneratedValue, findGeneratorKey, formatGeneratedValue, generateTableData, defaultGeneratorParams, supportsGeneratedMultiRowValues, UniqueValueGenerationError } from "@/lib/dataGrid/dataGenerate"; import { qualifiedTableName, quoteTableIdentifier } from "@/lib/table/tableSelectSql"; import { isTauriRuntime } from "@/lib/backend/tauriRuntime"; import { effectiveDatabaseTypeForConnection } from "@/lib/database/jdbcDialect"; @@ -61,6 +61,7 @@ interface GeneratedTableResult extends GenerateResult { schema: string; } const generatedResults = ref([]); +const generationError = ref(""); const connectionName = computed(() => (props.prefillConnectionId ? store.getConfig(props.prefillConnectionId)?.name : "")); @@ -396,25 +397,31 @@ async function fetchMaxValues(cfg: TableGenerateConfig): Promise 0 ? tableOrder.value : Object.keys(configs); - for (const key of order) { - if (!checkedTables[key]) continue; - const cfg = configs[key]; - let columns = cfg.columns.filter((col) => checkedColumns[colKey(cfg.schema, cfg.tableName, col.columnName)] !== false); - if (columns.length === 0) continue; - const aiStarts = await fetchMaxValues(cfg); - if (Object.keys(aiStarts).length > 0) { - columns = columns.map((col) => { - const start = aiStarts[col.columnName]; - if (start !== undefined) { - return { ...col, generatorKey: "sequence", generatorParams: { startValue: start, increment: 1 } }; - } - return col; - }); + try { + const order = tableOrder.value.length > 0 ? tableOrder.value : Object.keys(configs); + for (const key of order) { + if (!checkedTables[key]) continue; + const cfg = configs[key]; + let columns = cfg.columns.filter((col) => checkedColumns[colKey(cfg.schema, cfg.tableName, col.columnName)] !== false); + if (columns.length === 0) continue; + const aiStarts = await fetchMaxValues(cfg); + if (Object.keys(aiStarts).length > 0) { + columns = columns.map((col) => { + const start = aiStarts[col.columnName]; + if (start !== undefined) { + return { ...col, generatorKey: "sequence", generatorParams: { startValue: start, increment: 1 } }; + } + return col; + }); + } + const result = generateTableData({ ...cfg, columns }, dbType.value); + results.push({ tableName: cfg.tableName, schema: cfg.schema, ...result }); } - const result = generateTableData({ ...cfg, columns }, dbType.value); - results.push({ tableName: cfg.tableName, schema: cfg.schema, ...result }); + } catch (error) { + generationError.value = generationErrorMessage(error); + return; } generatedResults.value = results; previewTableIndex.value = 0; @@ -438,8 +445,20 @@ async function regenerate() { return col; }); } - const result = generateTableData({ ...cfg, columns }, dbType.value); - generatedResults.value[previewTableIndex.value] = { tableName: cfg.tableName, schema: cfg.schema, ...result }; + generationError.value = ""; + try { + const result = generateTableData({ ...cfg, columns }, dbType.value); + generatedResults.value[previewTableIndex.value] = { tableName: cfg.tableName, schema: cfg.schema, ...result }; + } catch (error) { + generationError.value = generationErrorMessage(error); + } +} + +function generationErrorMessage(error: unknown): string { + if (error instanceof UniqueValueGenerationError) { + return t("dataGenerate.uniqueExhausted", { table: error.tableName, column: error.columnName, attempts: error.attempts }); + } + return error instanceof Error ? error.message : String(error); } function copyAllSql() { @@ -498,7 +517,7 @@ function allSqlStatements(): string[] { } async function startInsert() { - if (executing.value) return; + if (executing.value || generationError.value) return; const cid = props.prefillConnectionId; const db = props.prefillDatabase; if (!cid || !db) return; @@ -807,6 +826,8 @@ async function onFileSelected(event: Event) { {{ connectionName || props.prefillDatabase }} + +