feat(export): honor exclude-primary-keys in SQL script exports

This commit is contained in:
高桥凉介 authored and GitHub committed 2026-09-17 14:13:36 +08:00
1 parent 137a1a4161
commit d17ce46626
16 files changed
+464 -68

No files matched your search

@@ -35,6 +35,7 @@ vi.mock("vue-i18n", () => ({
}));
import { useSidebarTreeExportRuntime } from "@/composables/useSidebarTreeExportRuntime";
import { DEFAULT_DATA_GRID_EXTRACTOR_OPTIONS } from "@/lib/dataGrid/dataGridCopyExtractor";
import { showStructurePreviewDialog, structurePreviewSql, structurePreviewTitle } from "@/components/sidebar/sidebarTreeDialogState";
function functionBody(name: string): string {
@@ -78,6 +79,7 @@ function exportSettings() {
exportBatchSize: 128,
exportRowLimit: 500,
exportRowLimitEnabled: true,
dataGridExtractorOptions: DEFAULT_DATA_GRID_EXTRACTOR_OPTIONS,
},
};
}
@@ -1170,6 +1170,24 @@ export function useDataGridExport(options: UseDataGridExportOptions) {
await exportAllResultsXlsxResult(true);
}
/**
* SQL 导出需要排除的主键列:跟随数据提取设置里的“排除主键”,与
* copy-as-INSERT (e3d5d1418) 一致只剔除自增/identity 主键,手动赋值的
* 主键保留,否则回放 INSERT 会缺值;只有拿得到表元数据时才生效。
*/
function sqlExportExcludedColumns(): string[] | undefined {
if (!extractorOptionsOption?.value?.sql.excludePrimaryKeysFromInsert) return undefined;
const primaryKeys = tableMeta.value?.primaryKeys ?? [];
const autoGenerated = primaryKeys.filter((column) => isAutoGeneratedColumn(column, tableMeta.value));
return autoGenerated.length > 0 ? autoGenerated : undefined;
}
/** 供导出请求使用:把“不含主键”设置转换成后端请求字段。 */
function sqlExportPrimaryKeyOptions(): { excludePrimaryKeys?: boolean; primaryKeys?: string[] } {
const excludeColumns = sqlExportExcludedColumns();
return excludeColumns ? { excludePrimaryKeys: true, primaryKeys: excludeColumns } : {};
}
async function exportFullTableDataViaBackend(format: "csv" | "xlsx" | "json" | "markdown" | "sql" | "txt", rowIds?: number[], headerMode: XlsxHeaderMode = "name", autoFilter = true, sqlExportOptions?: SqlExportOptions): Promise<boolean> {
const meta = tableMeta.value;
// The backend table exporter currently builds two-part table names. External
@@ -1236,6 +1254,7 @@ export function useDataGridExport(options: UseDataGridExportOptions) {
columnTypes: columnTypes.value,
columnComments: format === "xlsx" ? buildXlsxHeaderOverrides(columns.value, visibleXlsxColumnComments.value, headerMode) : undefined,
primaryKeys: meta.primaryKeys,
...sqlExportPrimaryKeyOptions(),
whereInput: whereInput.value,
orderBy: orderBy.value,
skipCount: false,
@@ -1309,6 +1328,7 @@ export function useDataGridExport(options: UseDataGridExportOptions) {
? {
...baseRequest,
csvQuoteMode: useSettingsStore().editorSettings.csvQuoteMode,
...sqlExportPrimaryKeyOptions(),
dateTimeFormat: useSettingsStore().editorSettings.globalDateTimeExportFormat || undefined,
numericColumnRightAlign: useSettingsStore().editorSettings.numericColumnRightAlign ?? true,
columnComments,
@@ -1475,6 +1495,7 @@ export function useDataGridExport(options: UseDataGridExportOptions) {
spatialValues: exportData.spatialValues,
rows: exportData.rows,
insertMode,
excludeColumns: sqlExportExcludedColumns(),
});
logExportStage(
"sql-build-done",
@@ -1516,6 +1537,7 @@ export function useDataGridExport(options: UseDataGridExportOptions) {
spatialValues: exportData.spatialValues,
rows: exportData.rows,
insertMode,
excludeColumns: sqlExportExcludedColumns(),
});
await saveTextFile(content, exportFileName("export-page", "sql", { page: true }), "SQL", "sql");
toast(t("grid.exported"));
@@ -445,6 +445,7 @@ export function useSidebarTreeExportRuntime(options: SidebarTreeExportRuntimeOpt
columnComments,
autoFilter: format === "xlsx" ? autoFilter : undefined,
primaryKeys,
excludePrimaryKeys: settingsStore.editorSettings.dataGridExtractorOptions.sql.excludePrimaryKeysFromInsert === true,
batchSize: target.batchSize,
skipCount: format === "sql",
rowLimit: target.rowLimit,
+6
View File
@@ -5365,6 +5365,8 @@ export interface TableExportRequest {
columnTypes?: Array<string | null | undefined>;
columnComments?: Array<string | null> | null;
primaryKeys?: string[];
/** 导出 SQL 时是否排除主键列(对应数据提取设置里的“排除主键”)。 */
excludePrimaryKeys?: boolean;
whereInput?: string;
orderBy?: string;
skipCount?: boolean;
@@ -5427,6 +5429,10 @@ export interface QueryResultExportRequest {
columnComments?: Array<string | null> | null;
autoFilter?: boolean;
identifierQuote?: string;
/** 导出 SQL 时是否排除主键列(对应数据提取设置里的“排除主键”)。 */
excludePrimaryKeys?: boolean;
/** 结果集对应的原表主键列名,由前端从表元数据带入。 */
primaryKeys?: string[];
}
export async function startTableExport(request: TableExportRequest, onProgress: (progress: TableExportProgress) => void): Promise<TableExportProgress> {
@@ -47,6 +47,8 @@ export interface BuildExportInsertStatementsOptions {
spatialColumns?: QueryResult["spatial_columns"];
spatialValues?: QueryResult["spatial_values"];
rows: QueryResult["rows"];
/** 生成 INSERT 时需要排除的列名(例如导出时不带主键),忽略大小写匹配。 */
excludeColumns?: string[];
batchSize?: number;
}
@@ -40,6 +40,7 @@ export interface FormatSqlInsertOptions {
spatialValues?: QueryResult["spatial_values"];
rows: ExportCellValue[][];
insertMode?: SqlInsertMode;
excludeColumns?: string[];
}
export function formatSqlInsert({ insertMode = "batch", ...options }: FormatSqlInsertOptions): Promise<string> {