fdb2 1.0.6 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/.vscodeignore +45 -0
  2. package/README.md +24 -85
  3. package/dist/package.json +115 -0
  4. package/dist/pnpm-lock.yaml +7447 -0
  5. package/dist/public/explorer.css +244 -111
  6. package/dist/public/explorer.js +523 -278
  7. package/dist/scripts/preinstall.js +112 -0
  8. package/dist/server/index.d.ts.map +1 -1
  9. package/dist/server/index.js +4 -9
  10. package/dist/server/index.js.map +1 -1
  11. package/dist/server/index.ts +5 -10
  12. package/dist/server/service/connection.service.d.ts.map +1 -1
  13. package/dist/server/service/connection.service.js +1 -0
  14. package/dist/server/service/connection.service.js.map +1 -1
  15. package/dist/server/service/connection.service.ts +1 -0
  16. package/dist/server/service/database/base.service.d.ts +4 -0
  17. package/dist/server/service/database/base.service.d.ts.map +1 -1
  18. package/dist/server/service/database/base.service.js +3 -3
  19. package/dist/server/service/database/base.service.js.map +1 -1
  20. package/dist/server/service/database/base.service.ts +8 -3
  21. package/dist/server/service/database/cockroachdb.service.d.ts +5 -0
  22. package/dist/server/service/database/cockroachdb.service.d.ts.map +1 -1
  23. package/dist/server/service/database/cockroachdb.service.js +112 -0
  24. package/dist/server/service/database/cockroachdb.service.js.map +1 -1
  25. package/dist/server/service/database/cockroachdb.service.ts +123 -0
  26. package/dist/server/service/database/database.service.d.ts +4 -0
  27. package/dist/server/service/database/database.service.d.ts.map +1 -1
  28. package/dist/server/service/database/database.service.js +8 -0
  29. package/dist/server/service/database/database.service.js.map +1 -1
  30. package/dist/server/service/database/database.service.ts +9 -0
  31. package/dist/server/service/database/mongodb.service.d.ts +6 -0
  32. package/dist/server/service/database/mongodb.service.d.ts.map +1 -1
  33. package/dist/server/service/database/mongodb.service.js +8 -0
  34. package/dist/server/service/database/mongodb.service.js.map +1 -1
  35. package/dist/server/service/database/mongodb.service.ts +9 -0
  36. package/dist/server/service/database/mssql.service.d.ts +4 -0
  37. package/dist/server/service/database/mssql.service.d.ts.map +1 -1
  38. package/dist/server/service/database/mssql.service.js +105 -0
  39. package/dist/server/service/database/mssql.service.js.map +1 -1
  40. package/dist/server/service/database/mssql.service.ts +118 -0
  41. package/dist/server/service/database/mysql.service.d.ts +4 -0
  42. package/dist/server/service/database/mysql.service.d.ts.map +1 -1
  43. package/dist/server/service/database/mysql.service.js +116 -0
  44. package/dist/server/service/database/mysql.service.js.map +1 -1
  45. package/dist/server/service/database/mysql.service.ts +130 -0
  46. package/dist/server/service/database/oracle.service.d.ts +4 -0
  47. package/dist/server/service/database/oracle.service.d.ts.map +1 -1
  48. package/dist/server/service/database/oracle.service.js +114 -0
  49. package/dist/server/service/database/oracle.service.js.map +1 -1
  50. package/dist/server/service/database/oracle.service.ts +128 -0
  51. package/dist/server/service/database/postgres.service.d.ts +4 -0
  52. package/dist/server/service/database/postgres.service.d.ts.map +1 -1
  53. package/dist/server/service/database/postgres.service.js +120 -0
  54. package/dist/server/service/database/postgres.service.js.map +1 -1
  55. package/dist/server/service/database/postgres.service.ts +131 -0
  56. package/dist/server/service/database/sap.service.d.ts +4 -0
  57. package/dist/server/service/database/sap.service.d.ts.map +1 -1
  58. package/dist/server/service/database/sap.service.js +107 -0
  59. package/dist/server/service/database/sap.service.js.map +1 -1
  60. package/dist/server/service/database/sap.service.ts +120 -0
  61. package/dist/server/service/database/sqlite.service.d.ts +5 -0
  62. package/dist/server/service/database/sqlite.service.d.ts.map +1 -1
  63. package/dist/server/service/database/sqlite.service.js +133 -0
  64. package/dist/server/service/database/sqlite.service.js.map +1 -1
  65. package/dist/server/service/database/sqlite.service.ts +150 -0
  66. package/fdb2.server.pid +1 -0
  67. package/package.json +18 -9
  68. package/packages/vscode/.vscodeignore +44 -0
  69. package/packages/vscode/README.md +62 -0
  70. package/packages/vscode/out/database-services/base.service.js +236 -0
  71. package/packages/vscode/out/database-services/base.service.js.map +1 -0
  72. package/packages/vscode/out/database-services/cockroachdb.service.js +634 -0
  73. package/packages/vscode/out/database-services/cockroachdb.service.js.map +1 -0
  74. package/packages/vscode/out/database-services/connection.service.js +346 -0
  75. package/packages/vscode/out/database-services/connection.service.js.map +1 -0
  76. package/packages/vscode/out/database-services/database.service.js +571 -0
  77. package/packages/vscode/out/database-services/database.service.js.map +1 -0
  78. package/packages/vscode/out/database-services/index.js +18 -0
  79. package/packages/vscode/out/database-services/index.js.map +1 -0
  80. package/packages/vscode/out/database-services/model/connection.entity.js +11 -0
  81. package/packages/vscode/out/database-services/model/connection.entity.js.map +1 -0
  82. package/packages/vscode/out/database-services/model/database.entity.js +35 -0
  83. package/packages/vscode/out/database-services/model/database.entity.js.map +1 -0
  84. package/packages/vscode/out/database-services/mongodb.service.js +458 -0
  85. package/packages/vscode/out/database-services/mongodb.service.js.map +1 -0
  86. package/packages/vscode/out/database-services/mssql.service.js +694 -0
  87. package/packages/vscode/out/database-services/mssql.service.js.map +1 -0
  88. package/packages/vscode/out/database-services/mysql.service.js +735 -0
  89. package/packages/vscode/out/database-services/mysql.service.js.map +1 -0
  90. package/packages/vscode/out/database-services/oracle.service.js +787 -0
  91. package/packages/vscode/out/database-services/oracle.service.js.map +1 -0
  92. package/packages/vscode/out/database-services/postgres.service.js +696 -0
  93. package/packages/vscode/out/database-services/postgres.service.js.map +1 -0
  94. package/packages/vscode/out/database-services/sap.service.js +695 -0
  95. package/packages/vscode/out/database-services/sap.service.js.map +1 -0
  96. package/packages/vscode/out/database-services/sqlite.service.js +532 -0
  97. package/packages/vscode/out/database-services/sqlite.service.js.map +1 -0
  98. package/packages/vscode/out/extension.js +93 -0
  99. package/packages/vscode/out/extension.js.map +1 -0
  100. package/packages/vscode/out/provider/DatabaseTreeProvider.js +159 -0
  101. package/packages/vscode/out/provider/DatabaseTreeProvider.js.map +1 -0
  102. package/packages/vscode/out/provider/WebViewProvider.js +259 -0
  103. package/packages/vscode/out/provider/WebViewProvider.js.map +1 -0
  104. package/packages/vscode/out/service/ConnectionManager.js +105 -0
  105. package/packages/vscode/out/service/ConnectionManager.js.map +1 -0
  106. package/packages/vscode/out/service/DatabaseServiceBridge.js +395 -0
  107. package/packages/vscode/out/service/DatabaseServiceBridge.js.map +1 -0
  108. package/packages/vscode/out/typings/connection.js +3 -0
  109. package/packages/vscode/out/typings/connection.js.map +1 -0
  110. package/packages/vscode/package.json +142 -0
  111. package/packages/vscode/resources/icon.svg +5 -0
  112. package/packages/vscode/resources/webview/_plugin-vue_export-helper.js +6529 -0
  113. package/packages/vscode/resources/webview/_plugin-vue_export-helper.js.map +1 -0
  114. package/packages/vscode/resources/webview/connection.css +69 -0
  115. package/packages/vscode/resources/webview/connection.js +228 -0
  116. package/packages/vscode/resources/webview/connection.js.map +1 -0
  117. package/packages/vscode/resources/webview/database.css +259 -0
  118. package/packages/vscode/resources/webview/database.js +275 -0
  119. package/packages/vscode/resources/webview/database.js.map +1 -0
  120. package/packages/vscode/resources/webview/favicon.ico +0 -0
  121. package/packages/vscode/resources/webview/index.html +9 -0
  122. package/packages/vscode/resources/webview/modules/header.tpl +14 -0
  123. package/packages/vscode/resources/webview/modules/initial_state.tpl +55 -0
  124. package/packages/vscode/resources/webview/query.css +162 -0
  125. package/packages/vscode/resources/webview/query.js +198 -0
  126. package/packages/vscode/resources/webview/query.js.map +1 -0
  127. package/packages/vscode/src/database-services/base.service.js.map +1 -0
  128. package/packages/vscode/src/database-services/base.service.ts +363 -0
  129. package/packages/vscode/src/database-services/cockroachdb.service.js.map +1 -0
  130. package/packages/vscode/src/database-services/cockroachdb.service.ts +659 -0
  131. package/packages/vscode/src/database-services/connection.service.ts +341 -0
  132. package/packages/vscode/src/database-services/database.service.ts +630 -0
  133. package/packages/vscode/src/database-services/index.ts +7 -0
  134. package/packages/vscode/src/database-services/model/connection.entity.js +11 -0
  135. package/packages/vscode/src/database-services/model/connection.entity.js.map +1 -0
  136. package/packages/vscode/src/database-services/model/connection.entity.ts +66 -0
  137. package/packages/vscode/src/database-services/model/database.entity.js +35 -0
  138. package/packages/vscode/src/database-services/model/database.entity.js.map +1 -0
  139. package/packages/vscode/src/database-services/model/database.entity.ts +246 -0
  140. package/packages/vscode/src/database-services/mongodb.service.js.map +1 -0
  141. package/packages/vscode/src/database-services/mongodb.service.ts +454 -0
  142. package/packages/vscode/src/database-services/mssql.service.js.map +1 -0
  143. package/packages/vscode/src/database-services/mssql.service.ts +723 -0
  144. package/packages/vscode/src/database-services/mysql.service.js.map +1 -0
  145. package/packages/vscode/src/database-services/mysql.service.ts +761 -0
  146. package/packages/vscode/src/database-services/oracle.service.js.map +1 -0
  147. package/packages/vscode/src/database-services/oracle.service.ts +832 -0
  148. package/packages/vscode/src/database-services/postgres.service.js.map +1 -0
  149. package/packages/vscode/src/database-services/postgres.service.ts +741 -0
  150. package/packages/vscode/src/database-services/sap.service.js.map +1 -0
  151. package/packages/vscode/src/database-services/sap.service.ts +713 -0
  152. package/packages/vscode/src/database-services/sqlite.service.js.map +1 -0
  153. package/packages/vscode/src/database-services/sqlite.service.ts +559 -0
  154. package/packages/vscode/src/extension.ts +76 -0
  155. package/packages/vscode/src/provider/DatabaseTreeProvider.ts +167 -0
  156. package/packages/vscode/src/provider/WebViewProvider.ts +277 -0
  157. package/packages/vscode/src/service/DatabaseServiceBridge.ts +414 -0
  158. package/packages/vscode/src/typings/connection.ts +90 -0
  159. package/packages/vscode/tsconfig.json +21 -0
  160. package/public/fdb2.png +0 -0
  161. package/server/backups/db_ai_breakout_2026-03-11T08-38-48-677Z.sql +0 -0
  162. package/server/index.ts +5 -10
  163. package/server/model/connection.entity.js +11 -0
  164. package/server/model/connection.entity.js.map +1 -0
  165. package/server/model/database.entity.js +35 -0
  166. package/server/model/database.entity.js.map +1 -0
  167. package/server/service/connection.service.ts +1 -0
  168. package/server/service/database/base.service.ts +8 -3
  169. package/server/service/database/cockroachdb.service.ts +123 -0
  170. package/server/service/database/database.service.ts +9 -0
  171. package/server/service/database/mongodb.service.ts +9 -0
  172. package/server/service/database/mssql.service.ts +118 -0
  173. package/server/service/database/mysql.service.ts +130 -0
  174. package/server/service/database/oracle.service.ts +128 -0
  175. package/server/service/database/postgres.service.ts +131 -0
  176. package/server/service/database/sap.service.ts +120 -0
  177. package/server/service/database/sqlite.service.ts +150 -0
  178. package/server/tsconfig.json +20 -0
  179. package/src/components/connection-editor/index.vue +0 -1
  180. package/src/platform/database/components/db-tools.vue +414 -174
  181. package/src/platform/database/components/table-detail.vue +3 -2
  182. package/src/platform/database/components/table-editor.vue +245 -18
  183. package/src/platform/vscode/bridge.ts +121 -0
  184. package/src/platform/vscode/components/ConnectionPanel.vue +272 -0
  185. package/src/platform/vscode/components/DatabasePanel.vue +532 -0
  186. package/src/platform/vscode/components/QueryPanel.vue +371 -0
  187. package/src/platform/vscode/entry/connection.ts +13 -0
  188. package/src/platform/vscode/entry/database.ts +13 -0
  189. package/src/platform/vscode/entry/query.ts +13 -0
  190. package/src/platform/vscode/index.ts +5 -0
  191. package/src/service/database.ts +2 -6
  192. package/vite.config.ts +46 -6
  193. package/vite.config.vscode.ts +47 -0
@@ -158,9 +158,9 @@
158
158
  </thead>
159
159
  <tbody>
160
160
  <tr v-for="(row, index) in paginatedData" :key="index">
161
- <td v-for="(value, key) in row" :key="key">
161
+ <td v-for="column in safeTableColumns" :key="column.name">
162
162
  <div class="cell-value">
163
- {{ formatCellValue(value) }}
163
+ {{ formatCellValue(row[column.name]) }}
164
164
  </div>
165
165
  </td>
166
166
  <td>
@@ -461,6 +461,7 @@
461
461
  :connection="connection"
462
462
  :database="database"
463
463
  :table="table"
464
+ :columns="tableStructure?.columns"
464
465
  :mode="tableEditorMode"
465
466
  @close="closeTableEditor"
466
467
  @submit="handleTableStructureChange"
@@ -193,6 +193,7 @@ import type { ConnectionEntity, TableEntity } from '@/typings/database';
193
193
  import { DatabaseService } from '@/service/database';
194
194
  import { modal } from '@/utils/modal';
195
195
  import { getColumnTypesByName, ColumnCategory } from '@/typings/database-types';
196
+ import { isNumericType, isBooleanType } from '@/utils/database-types';
196
197
 
197
198
  // Props
198
199
  const props = defineProps<{
@@ -200,6 +201,7 @@ const props = defineProps<{
200
201
  connection: ConnectionEntity | null;
201
202
  database: string;
202
203
  table?: TableEntity | null;
204
+ columns?: any[];
203
205
  mode: 'create' | 'edit';
204
206
  }>();
205
207
 
@@ -245,13 +247,21 @@ const formData = ref({
245
247
  }]
246
248
  });
247
249
 
250
+ // 原始表结构(用于对比差异)
251
+ const originalTableData = ref({
252
+ tableName: '',
253
+ tableComment: '',
254
+ columns: []
255
+ });
256
+
248
257
  // 初始化表单数据
249
- function initFormData() {
258
+ function initFormData() {
250
259
  if (props.mode === 'edit' && props.table) {
251
- formData.value = {
260
+ const columns = props.columns || props.table.columns || [];
261
+ const tableData = {
252
262
  tableName: props.table.name || '',
253
263
  tableComment: props.table.comment || '',
254
- columns: props.table.columns?.map(col => ({
264
+ columns: columns.map(col => ({
255
265
  name: col.name || '',
256
266
  type: col.type || '',
257
267
  length: col.length || '',
@@ -264,6 +274,8 @@ function initFormData() {
264
274
  comment: col.comment || ''
265
275
  })) || []
266
276
  };
277
+ formData.value = { ...tableData };
278
+ originalTableData.value = JSON.parse(JSON.stringify(tableData));
267
279
  } else {
268
280
  formData.value = {
269
281
  tableName: '',
@@ -281,9 +293,70 @@ function initFormData() {
281
293
  comment: ''
282
294
  }]
283
295
  };
296
+ originalTableData.value = {
297
+ tableName: '',
298
+ tableComment: '',
299
+ columns: []
300
+ };
284
301
  }
285
302
  }
286
303
 
304
+ // 计算表结构差异
305
+ function calculateTableDiff() {
306
+ const diff = {
307
+ tableName: formData.value.tableName,
308
+ tableCommentChanged: formData.value.tableComment !== originalTableData.value.tableComment,
309
+ tableComment: formData.value.tableComment,
310
+ addedColumns: [],
311
+ modifiedColumns: [],
312
+ deletedColumns: []
313
+ };
314
+
315
+ // 创建原始列的映射(按列名)
316
+ const originalColumnsMap = new Map();
317
+ originalTableData.value.columns.forEach(col => {
318
+ originalColumnsMap.set(col.name, col);
319
+ });
320
+
321
+ // 检查新增和修改的列
322
+ formData.value.columns.forEach(newCol => {
323
+ const originalCol = originalColumnsMap.get(newCol.name);
324
+
325
+ if (!originalCol) {
326
+ // 新增列
327
+ diff.addedColumns.push(newCol);
328
+ } else {
329
+ // 检查列是否被修改
330
+ const isModified =
331
+ newCol.type !== originalCol.type ||
332
+ newCol.length !== originalCol.length ||
333
+ newCol.precision !== originalCol.precision ||
334
+ newCol.scale !== originalCol.scale ||
335
+ newCol.nullable !== originalCol.nullable ||
336
+ newCol.defaultValue !== originalCol.defaultValue ||
337
+ newCol.isPrimary !== originalCol.isPrimary ||
338
+ newCol.isAutoIncrement !== originalCol.isAutoIncrement ||
339
+ newCol.comment !== originalCol.comment;
340
+
341
+ if (isModified) {
342
+ diff.modifiedColumns.push({
343
+ oldColumn: originalCol,
344
+ newColumn: newCol
345
+ });
346
+ }
347
+ }
348
+ });
349
+
350
+ // 检查删除的列
351
+ originalTableData.value.columns.forEach(originalCol => {
352
+ const existsInNew = formData.value.columns.some(newCol => newCol.name === originalCol.name);
353
+ if (!existsInNew) {
354
+ diff.deletedColumns.push(originalCol);
355
+ }
356
+ });
357
+
358
+ return diff;
359
+ }
287
360
  // 添加字段
288
361
  function addColumn() {
289
362
  formData.value.columns.push({
@@ -347,10 +420,10 @@ function generateSQL(): string {
347
420
 
348
421
  let sql = `${quoteIdentifier(col.name)} ${col.type}`;
349
422
 
350
- // 处理长度和精度参数
351
- if (col.length && (needsLength(col) || col.type.includes('CHAR'))) {
423
+ // 处理长度和精度参数(仅当类型中不包含括号时)
424
+ if (!col.type.includes('(') && col.length && (needsLength(col) || col.type.includes('CHAR'))) {
352
425
  sql += `(${col.length})`;
353
- } else if (col.precision) {
426
+ } else if (!col.type.includes('(') && col.precision) {
354
427
  if (col.scale) {
355
428
  sql += `(${col.precision},${col.scale})`;
356
429
  } else {
@@ -490,8 +563,125 @@ function generateSQL(): string {
490
563
 
491
564
  return sql;
492
565
  } else {
493
- // 修改表SQL(简化版,实际应该对比差异)
494
- return `-- 表结构修改SQL(需要对比差异生成)\n-- 当前表名: ${formData.value.tableName}`;
566
+ // 修改表SQL
567
+ const quoteIdentifier = (name: string) => {
568
+ if (!props.connection) return `"${name}"`;
569
+ switch (props.connection.type.toLowerCase()) {
570
+ case 'mysql': return `\`${name}\``;
571
+ case 'postgres': return `"${name}"`;
572
+ case 'sqlite': return `"${name}"`;
573
+ case 'oracle': return `"${name.toUpperCase()}"`;
574
+ case 'mssql': return `[${name}]`;
575
+ default: return `"${name}"`;
576
+ }
577
+ };
578
+
579
+ const sqlStatements: string[] = [];
580
+ const tableName = formData.value.tableName;
581
+
582
+ // 修改表注释
583
+ if (formData.value.tableComment) {
584
+ switch (props.connection?.type.toLowerCase()) {
585
+ case 'mysql':
586
+ sqlStatements.push(`ALTER TABLE ${quoteIdentifier(tableName)} COMMENT='${formData.value.tableComment}'`);
587
+ break;
588
+ case 'postgres':
589
+ sqlStatements.push(`COMMENT ON TABLE ${quoteIdentifier(tableName)} IS '${formData.value.tableComment}'`);
590
+ break;
591
+ case 'oracle':
592
+ sqlStatements.push(`COMMENT ON TABLE ${quoteIdentifier(tableName)} IS '${formData.value.tableComment}'`);
593
+ break;
594
+ case 'mssql':
595
+ sqlStatements.push(`EXEC sp_addextendedproperty 'MS_Description', '${formData.value.tableComment}', 'SCHEMA', 'dbo', 'TABLE', '${tableName}'`);
596
+ break;
597
+ }
598
+ }
599
+
600
+ // 生成列修改语句
601
+ formData.value.columns.forEach(col => {
602
+ if (!col.name || !col.type) return;
603
+
604
+ let columnSQL = `${quoteIdentifier(col.name)} ${col.type}`;
605
+
606
+ // 处理长度和精度参数(仅当类型中不包含括号时)
607
+ if (!col.type.includes('(') && col.length && (needsLength(col) || col.type.includes('CHAR'))) {
608
+ columnSQL += `(${col.length})`;
609
+ } else if (!col.type.includes('(') && col.precision) {
610
+ if (col.scale) {
611
+ columnSQL += `(${col.precision},${col.scale})`;
612
+ } else {
613
+ columnSQL += `(${col.precision})`;
614
+ }
615
+ }
616
+
617
+ // 处理NULL约束
618
+ if (!col.nullable) {
619
+ columnSQL += ' NOT NULL';
620
+ } else {
621
+ columnSQL += ' NULL';
622
+ }
623
+
624
+ // 处理默认值
625
+ if (col.defaultValue) {
626
+ columnSQL += ` DEFAULT ${formatDefaultValue(col.defaultValue, col.type)}`;
627
+ }
628
+
629
+ // 处理注释
630
+ let commentStatement = '';
631
+ if (col.comment) {
632
+ switch (props.connection?.type.toLowerCase()) {
633
+ case 'mysql':
634
+ columnSQL += ` COMMENT '${col.comment}'`;
635
+ break;
636
+ case 'postgres':
637
+ commentStatement = `COMMENT ON COLUMN ${quoteIdentifier(tableName)}.${quoteIdentifier(col.name)} IS '${col.comment}'`;
638
+ break;
639
+ case 'oracle':
640
+ columnSQL += ` COMMENT '${col.comment}'`;
641
+ break;
642
+ case 'mssql':
643
+ commentStatement = `EXEC sp_addextendedproperty 'MS_Description', '${col.comment}', 'SCHEMA', 'dbo', 'TABLE', '${tableName}', 'COLUMN', '${col.name}'`;
644
+ break;
645
+ }
646
+ }
647
+
648
+ // 根据数据库类型生成 ALTER COLUMN 或 MODIFY COLUMN 语句
649
+ switch (props.connection?.type.toLowerCase()) {
650
+ case 'mysql':
651
+ sqlStatements.push(`ALTER TABLE ${quoteIdentifier(tableName)} MODIFY COLUMN ${columnSQL}`);
652
+ break;
653
+ case 'postgres':
654
+ case 'mssql':
655
+ sqlStatements.push(`ALTER TABLE ${quoteIdentifier(tableName)} ALTER COLUMN ${columnSQL}`);
656
+ break;
657
+ case 'oracle':
658
+ sqlStatements.push(`ALTER TABLE ${quoteIdentifier(tableName)} MODIFY ${columnSQL}`);
659
+ break;
660
+ case 'sqlite':
661
+ // SQLite 不支持直接修改列,需要重建表
662
+ sqlStatements.push(`-- SQLite 不支持直接修改列,需要重建表`);
663
+ break;
664
+ }
665
+
666
+ // 添加注释语句
667
+ if (commentStatement) {
668
+ sqlStatements.push(commentStatement);
669
+ }
670
+ });
671
+
672
+ // 处理主键
673
+ const primaryKeys = formData.value.columns
674
+ .filter(col => col.isPrimary)
675
+ .map(col => quoteIdentifier(col.name));
676
+
677
+ if (primaryKeys.length > 0) {
678
+ // 先删除旧主键(如果存在)
679
+ sqlStatements.push(`ALTER TABLE ${quoteIdentifier(tableName)} DROP PRIMARY KEY`);
680
+ // 添加新主键
681
+ sqlStatements.push(`ALTER TABLE ${quoteIdentifier(tableName)} ADD PRIMARY KEY (${primaryKeys.join(', ')})`);
682
+ }
683
+
684
+ return sqlStatements.join(';\n') + ';';
495
685
  }
496
686
  }
497
687
 
@@ -501,15 +691,23 @@ function formatDefaultValue(value: any, type: string): string {
501
691
  return 'NULL';
502
692
  }
503
693
 
694
+ const lowerValue = String(value).toLowerCase();
695
+
696
+ // 处理特殊关键字(不加引号)
697
+ const specialKeywords = ['current_timestamp', 'now()', 'current_date', 'current_time', 'localtimestamp', 'localtime'];
698
+ if (specialKeywords.includes(lowerValue)) {
699
+ return value;
700
+ }
701
+
504
702
  const lowerType = type.toLowerCase();
505
703
 
506
704
  // 数值类型不加引号
507
- if (isNumberInput(lowerType) && !isNaN(value)) {
705
+ if (isNumericType(lowerType) && !isNaN(value)) {
508
706
  return String(value);
509
707
  }
510
708
 
511
709
  // 布尔类型
512
- if (isBooleanInput(lowerType)) {
710
+ if (isBooleanType(lowerType)) {
513
711
  return value ? 'TRUE' : 'FALSE';
514
712
  }
515
713
 
@@ -530,18 +728,41 @@ async function submit() {
530
728
  return;
531
729
  }
532
730
 
533
- const sql = generateSQL();
534
-
535
731
  if (!props.connection?.id) {
536
732
  await modal.warning('请先选择数据库连接');
537
733
  return;
538
734
  }
735
+
736
+ let result;
539
737
 
540
- const result = await databaseService.executeQuery(
541
- props.connection.id,
542
- sql,
543
- props.database
544
- );
738
+ if (props.mode === 'create') {
739
+ // 创建表:使用 SQL 语句
740
+ const sql = generateSQL();
741
+ result = await databaseService.executeQuery(
742
+ props.connection.id,
743
+ sql,
744
+ props.database
745
+ );
746
+ } else {
747
+ // 修改表:使用差异化对比
748
+ const tableDiff = calculateTableDiff();
749
+
750
+ // 检查是否有实际修改
751
+ if (tableDiff.addedColumns.length === 0 &&
752
+ tableDiff.modifiedColumns.length === 0 &&
753
+ tableDiff.deletedColumns.length === 0 &&
754
+ !tableDiff.tableCommentChanged) {
755
+ await modal.info('没有检测到任何修改');
756
+ return;
757
+ }
758
+
759
+ // 调用修改表接口(需要后端实现)
760
+ result = await databaseService.alterTable(
761
+ props.connection.id,
762
+ props.database,
763
+ tableDiff
764
+ );
765
+ }
545
766
 
546
767
  emit('submit', {
547
768
  success: result.ret === 0,
@@ -592,7 +813,13 @@ function getCategoryLabel(category: string): string {
592
813
 
593
814
  // 获取选中的类型信息
594
815
  function getSelectedType(column: any) {
595
- return columnTypes.value.find(t => t.name === column.type);
816
+ if (!column.type) return null;
817
+
818
+ // 提取类型名称(去掉括号和长度信息)
819
+ const typeName = column.type.match(/^[a-zA-Z]+/)?.[0] || column.type;
820
+
821
+ // 大小写不敏感匹配
822
+ return columnTypes.value.find(t => t.name.toLowerCase() === typeName.toLowerCase());
596
823
  }
597
824
 
598
825
  // 检查类型是否需要长度参数
@@ -0,0 +1,121 @@
1
+ /**
2
+ * VSCode WebView 桥接层
3
+ * 提供 Vue 应用与 VSCode 扩展之间的通信
4
+ */
5
+
6
+ /**
7
+ * VSCode API 接口
8
+ */
9
+ interface VSCodeAPI {
10
+ postMessage(message: any): void;
11
+ getState(): any;
12
+ setState(state: any): void;
13
+ }
14
+
15
+ declare const acquireVsCodeApi: () => VSCodeAPI;
16
+
17
+ /**
18
+ * VSCode 桥接类
19
+ */
20
+ export class VSCodeBridge {
21
+ private vscode: VSCodeAPI | null = null;
22
+
23
+ constructor() {
24
+ if (typeof window !== 'undefined' && typeof acquireVsCodeApi === 'function') {
25
+ this.vscode = acquireVsCodeApi();
26
+ }
27
+ }
28
+
29
+ /**
30
+ * 判断是否在 VSCode 环境中
31
+ */
32
+ isVSCodeEnvironment(): boolean {
33
+ return this.vscode !== null;
34
+ }
35
+
36
+ /**
37
+ * 发送消息到 VSCode 扩展
38
+ */
39
+ postMessage(message: any): void {
40
+ if (!this.vscode) {
41
+ console.warn('Not in VSCode environment');
42
+ return;
43
+ }
44
+ this.vscode.postMessage(message);
45
+ }
46
+
47
+ /**
48
+ * 监听来自 VSCode 扩展的消息
49
+ */
50
+ onMessage(callback: (message: any) => void): void {
51
+ window.addEventListener('message', event => {
52
+ // 安全检查:确保消息来自扩展
53
+ if (event.origin) {
54
+ return;
55
+ }
56
+ callback(event.data);
57
+ });
58
+ }
59
+
60
+ /**
61
+ * 获取状态
62
+ */
63
+ getState(): any {
64
+ if (!this.vscode) {
65
+ return {};
66
+ }
67
+ return this.vscode.getState();
68
+ }
69
+
70
+ /**
71
+ * 保存状态
72
+ */
73
+ setState(state: any): void {
74
+ if (!this.vscode) {
75
+ return;
76
+ }
77
+ this.vscode.setState(state);
78
+ }
79
+
80
+ /**
81
+ * 初始化桥接
82
+ */
83
+ init(messageHandler?: (message: any) => void): void {
84
+ if (this.isVSCodeEnvironment()) {
85
+ if (messageHandler) {
86
+ this.onMessage(messageHandler);
87
+ }
88
+ // 恢复之前保存的状态
89
+ const savedState = this.getState();
90
+ if (savedState) {
91
+ this.postMessage({
92
+ command: 'restoreState',
93
+ data: savedState
94
+ });
95
+ }
96
+ }
97
+ }
98
+ }
99
+
100
+ // 创建全局实例
101
+ let bridgeInstance: VSCodeBridge | null = null;
102
+
103
+ /**
104
+ * 获取 VSCode 桥接实例
105
+ */
106
+ export function getVSCodeBridge(): VSCodeBridge {
107
+ if (!bridgeInstance) {
108
+ bridgeInstance = new VSCodeBridge();
109
+ }
110
+ return bridgeInstance;
111
+ }
112
+
113
+ /**
114
+ * 判断是否在 VSCode 环境中
115
+ */
116
+ export function isVSCodeEnvironment(): boolean {
117
+ if (!bridgeInstance) {
118
+ bridgeInstance = new VSCodeBridge();
119
+ }
120
+ return bridgeInstance.isVSCodeEnvironment();
121
+ }