feat(export): honor exclude-primary-keys in SQL script exports
This commit is contained in:
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,
|
||||
|
||||
@@ -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> {
|
||||
|
||||
Reference in new issue
Block a user