From aaf871994376148cff788d274f9f7c60210d2c5a Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Sun, 5 Jul 2026 01:12:06 -0600 Subject: [PATCH] update --- src/composables/sqlTable.ts | 38 ++- src/desktop/SqlSection.vue | 55 ++++- src/extensions/autocompletion.ts | 2 + src/extensions/sql.ts | 404 +++++++++++++++++++++++++++++++ src/templates.ts | 2 +- 5 files changed, 480 insertions(+), 21 deletions(-) create mode 100644 src/extensions/sql.ts diff --git a/src/composables/sqlTable.ts b/src/composables/sqlTable.ts index 2d35c21..f860116 100644 --- a/src/composables/sqlTable.ts +++ b/src/composables/sqlTable.ts @@ -3,7 +3,6 @@ import { buildSetupSql, defaultSqlTableId, sqlTables, - type SqlColumn, } from "../data/sqlTables" export const selectedTableId = ref(defaultSqlTableId) @@ -12,32 +11,49 @@ export function resetSqlTableSelection() { selectedTableId.value = defaultSqlTableId } +// SELECT / WITH 属于查询,直接展示查询结果的列;其余(增删改)回显整张表 +function isQuery(sql: string): boolean { + return /^\s*(SELECT|WITH)\b/i.test(sql) +} + export function buildSqlScript(studentSql: string) { const table = sqlTables.find((item) => item.id === selectedTableId.value) ?? sqlTables[0] const normalizedSql = studentSql.trim().replace(/;?\s*$/, ";") + if (isQuery(studentSql.trim())) { + return [buildSetupSql(table), ".headers on", normalizedSql].join("\n\n") + } return [ buildSetupSql(table), ".output /dev/null", normalizedSql, ".output stdout", + ".headers on", `SELECT * FROM ${table.tableName};`, ].join("\n\n") } -export function parseResultRows( - output: string, - columns: SqlColumn[], -): Record[] { - return output +export interface SqlResult { + columns: string[] + rows: Record[] +} + +// 输出为 sqlite CLI 的 list 模式(| 分隔),开启 .headers on 后首行是列名 +export function parseResult(output: string): SqlResult { + const lines = output .split("\n") .map((line) => line.trim()) .filter(Boolean) - .map((line) => { - const cells = line.split("|") - return Object.fromEntries( - columns.map((column, index) => [column.name, cells[index] ?? ""]), - ) + if (lines.length === 0) return { columns: [], rows: [] } + const columns = lines[0].split("|") + const rows = lines.slice(1).map((line, index) => { + const cells = line.split("|") + const record: Record = { __key: index } + columns.forEach((column, i) => { + record[column] = cells[i] ?? "" }) + return record + }) + return { columns, rows } } diff --git a/src/desktop/SqlSection.vue b/src/desktop/SqlSection.vue index d6ae696..cb0b3e3 100644 --- a/src/desktop/SqlSection.vue +++ b/src/desktop/SqlSection.vue @@ -1,8 +1,8 @@