From b118ca31ed49e9f45686a91790f5513426df11cd Mon Sep 17 00:00:00 2001 From: miracle Date: Mon, 6 Jul 2026 13:21:45 +0800 Subject: [PATCH] =?UTF-8?q?[Feat]=EF=BC=9A=E5=AE=9E=E7=8E=B0SQL=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E6=9B=BF=E6=8D=A2=20(#2597)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/editor/SqlParameterDialog.vue | 48 ++-- .../src/components/layout/AppDialogs.vue | 3 +- .../src/composables/useSqlExecution.ts | 6 +- 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/pt-BR.ts | 1 + apps/desktop/src/i18n/locales/zh-CN.ts | 1 + apps/desktop/src/i18n/locales/zh-TW.ts | 1 + .../lib/__tests__/sql/sqlParameters.spec.ts | 68 +++++- apps/desktop/src/lib/sql/sqlParameters.ts | 207 +++++++++++++++++- 12 files changed, 306 insertions(+), 33 deletions(-) diff --git a/apps/desktop/src/components/editor/SqlParameterDialog.vue b/apps/desktop/src/components/editor/SqlParameterDialog.vue index faf4cf634..f1da7b13a 100644 --- a/apps/desktop/src/components/editor/SqlParameterDialog.vue +++ b/apps/desktop/src/components/editor/SqlParameterDialog.vue @@ -9,7 +9,7 @@ import { Popover, PopoverAnchor, PopoverContent } from "@/components/ui/popover" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import TruncatedTextTooltip from "@/components/ui/TruncatedTextTooltip.vue"; import { loadSqlParameterHistory, rememberSqlParameterValues } from "@/lib/sql/sqlParameterHistory"; -import { substituteSqlParameters, type SqlParameterInput, type SqlParameterValueKind } from "@/lib/sql/sqlParameters"; +import { substituteSqlParameters, type SqlParameterDescriptor, type SqlParameterInput, type SqlParameterSyntax, type SqlParameterValueKind } from "@/lib/sql/sqlParameters"; import { useSqlHighlighter } from "@/composables/useSqlHighlighter"; const { t } = useI18n(); @@ -19,7 +19,7 @@ const open = defineModel("open", { default: false }); const props = defineProps<{ sql: string; - parameters: string[]; + parameters: SqlParameterDescriptor[]; }>(); const emit = defineEmits<{ @@ -33,6 +33,14 @@ let closeHistoryTimer: ReturnType | undefined; const parameterKinds: SqlParameterValueKind[] = ["string", "number", "boolean", "null", "raw"]; +const syntaxLabels: Record = { + positional: "?", + named: ":name", + shell: "${name}", + mybatis: "#{name}", + sqlserver: "@name", +}; + const resolvedSql = computed(() => substituteSqlParameters(props.sql, values.value)); const highlightedSql = computed(() => highlight(resolvedSql.value)); @@ -42,10 +50,10 @@ watch( if (!isOpen) return; const next: Record = {}; const nextHistories: Record = {}; - for (const name of props.parameters) { - const history = loadSqlParameterHistory(name); - nextHistories[name] = history; - next[name] = values.value[name] ?? history[0] ?? { kind: "string", value: "" }; + for (const parameter of props.parameters) { + const history = loadSqlParameterHistory(parameter.key); + nextHistories[parameter.key] = history; + next[parameter.key] = values.value[parameter.key] ?? history[0] ?? { kind: "string", value: "" }; } values.value = next; histories.value = nextHistories; @@ -111,15 +119,17 @@ function execute() {

{{ t("sqlParameters.description") }}

-
-
+
+
{{ t("sqlParameters.name") }}
+
{{ t("sqlParameters.syntax") }}
{{ t("sqlParameters.type") }}
{{ t("sqlParameters.value") }}
-
-
{{ name }}
- @@ -130,28 +140,28 @@ function execute() {
- +