fdb2 1.0.37 → 1.0.38
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.
- package/README.md +41 -0
- package/dist/public/explorer.css +517 -478
- package/dist/public/explorer.js +1114 -872
- package/dist/public/index.css +87 -27
- package/dist/public/index.js +97 -49
- package/dist/public/layout.js +2 -2
- package/dist/public/vue.js +1 -1
- package/dist/server/core/schema/__tests__/canonical.test.ts +195 -0
- package/dist/server/core/schema/__tests__/ddl-emitter.test.ts +456 -0
- package/dist/server/core/schema/__tests__/diff.test.ts +242 -0
- package/dist/server/core/schema/__tests__/roundtrip.property.test.ts +403 -0
- package/dist/server/core/schema/canonical.d.ts +50 -0
- package/dist/server/core/schema/canonical.d.ts.map +1 -0
- package/dist/server/core/schema/canonical.js +212 -0
- package/dist/server/core/schema/canonical.js.map +1 -0
- package/dist/server/core/schema/canonical.ts +223 -0
- package/dist/server/core/schema/ddl-emitter.d.ts +68 -0
- package/dist/server/core/schema/ddl-emitter.d.ts.map +1 -0
- package/dist/server/core/schema/ddl-emitter.js +813 -0
- package/dist/server/core/schema/ddl-emitter.js.map +1 -0
- package/dist/server/core/schema/ddl-emitter.ts +925 -0
- package/dist/server/core/schema/diff.d.ts +16 -0
- package/dist/server/core/schema/diff.d.ts.map +1 -0
- package/dist/server/core/schema/diff.js +115 -0
- package/dist/server/core/schema/diff.js.map +1 -0
- package/dist/server/core/schema/diff.ts +134 -0
- package/dist/server/core/schema/type-defaults.d.ts +27 -0
- package/dist/server/core/schema/type-defaults.d.ts.map +1 -0
- package/dist/server/core/schema/type-defaults.js +61 -0
- package/dist/server/core/schema/type-defaults.js.map +1 -0
- package/dist/server/core/schema/type-defaults.ts +79 -0
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +347 -124
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.ts +336 -161
- package/dist/server/model/ddl-spec.d.ts +163 -0
- package/dist/server/model/ddl-spec.d.ts.map +1 -0
- package/dist/server/model/ddl-spec.js +32 -0
- package/dist/server/model/ddl-spec.js.map +1 -0
- package/dist/server/model/ddl-spec.ts +175 -0
- package/dist/server/service/connection.service.d.ts +20 -0
- package/dist/server/service/connection.service.d.ts.map +1 -1
- package/dist/server/service/connection.service.js +99 -25
- package/dist/server/service/connection.service.js.map +1 -1
- package/dist/server/service/connection.service.ts +104 -25
- package/dist/server/service/database/base.service.d.ts +0 -4
- package/dist/server/service/database/base.service.d.ts.map +1 -1
- package/dist/server/service/database/base.service.js.map +1 -1
- package/dist/server/service/database/base.service.ts +0 -5
- package/dist/server/service/database/clickhouse.service.d.ts +0 -5
- package/dist/server/service/database/clickhouse.service.d.ts.map +1 -1
- package/dist/server/service/database/clickhouse.service.js +0 -49
- package/dist/server/service/database/clickhouse.service.js.map +1 -1
- package/dist/server/service/database/clickhouse.service.ts +0 -52
- package/dist/server/service/database/cockroachdb.service.d.ts +0 -5
- package/dist/server/service/database/cockroachdb.service.d.ts.map +1 -1
- package/dist/server/service/database/cockroachdb.service.js +11 -142
- package/dist/server/service/database/cockroachdb.service.js.map +1 -1
- package/dist/server/service/database/cockroachdb.service.ts +11 -161
- package/dist/server/service/database/database.service.d.ts +55 -2
- package/dist/server/service/database/database.service.d.ts.map +1 -1
- package/dist/server/service/database/database.service.js +246 -4
- package/dist/server/service/database/database.service.js.map +1 -1
- package/dist/server/service/database/database.service.ts +295 -7
- package/dist/server/service/database/mongodb.service.d.ts +0 -6
- package/dist/server/service/database/mongodb.service.d.ts.map +1 -1
- package/dist/server/service/database/mongodb.service.js +0 -8
- package/dist/server/service/database/mongodb.service.js.map +1 -1
- package/dist/server/service/database/mongodb.service.ts +0 -8
- package/dist/server/service/database/mssql.service.d.ts +8 -4
- package/dist/server/service/database/mssql.service.d.ts.map +1 -1
- package/dist/server/service/database/mssql.service.js +27 -101
- package/dist/server/service/database/mssql.service.js.map +1 -1
- package/dist/server/service/database/mssql.service.ts +28 -122
- package/dist/server/service/database/mysql.service.d.ts +0 -4
- package/dist/server/service/database/mysql.service.d.ts.map +1 -1
- package/dist/server/service/database/mysql.service.js +11 -137
- package/dist/server/service/database/mysql.service.js.map +1 -1
- package/dist/server/service/database/mysql.service.ts +11 -173
- package/dist/server/service/database/oracle.service.d.ts +0 -4
- package/dist/server/service/database/oracle.service.d.ts.map +1 -1
- package/dist/server/service/database/oracle.service.js +11 -104
- package/dist/server/service/database/oracle.service.js.map +1 -1
- package/dist/server/service/database/oracle.service.ts +11 -127
- package/dist/server/service/database/postgres.service.d.ts +0 -4
- package/dist/server/service/database/postgres.service.d.ts.map +1 -1
- package/dist/server/service/database/postgres.service.js +11 -112
- package/dist/server/service/database/postgres.service.js.map +1 -1
- package/dist/server/service/database/postgres.service.ts +11 -133
- package/dist/server/service/database/sap.service.d.ts +0 -4
- package/dist/server/service/database/sap.service.d.ts.map +1 -1
- package/dist/server/service/database/sap.service.js +11 -137
- package/dist/server/service/database/sap.service.js.map +1 -1
- package/dist/server/service/database/sap.service.ts +11 -158
- package/dist/server/service/database/sql-type.helper.d.ts.map +1 -1
- package/dist/server/service/database/sql-type.helper.js +9 -47
- package/dist/server/service/database/sql-type.helper.js.map +1 -1
- package/dist/server/service/database/sql-type.helper.ts +11 -53
- package/dist/server/service/database/sqlite.service.d.ts +0 -5
- package/dist/server/service/database/sqlite.service.d.ts.map +1 -1
- package/dist/server/service/database/sqlite.service.js +11 -147
- package/dist/server/service/database/sqlite.service.js.map +1 -1
- package/dist/server/service/database/sqlite.service.ts +11 -177
- package/package.json +1 -1
- package/server.js +1 -1
|
@@ -9,6 +9,8 @@ import {
|
|
|
9
9
|
} from '../../model/database.entity';
|
|
10
10
|
import * as fs from 'fs';
|
|
11
11
|
import * as path from 'path';
|
|
12
|
+
import { canonicalizeTableEntity } from '../../core/schema/canonical';
|
|
13
|
+
import { emitCreateDdl } from '../../core/schema/ddl-emitter';
|
|
12
14
|
|
|
13
15
|
/**
|
|
14
16
|
* SAP HANA数据库服务实现
|
|
@@ -711,125 +713,6 @@ export class SAPHANADatabaseService extends BaseDatabaseService {
|
|
|
711
713
|
return `"${identifier}"`;
|
|
712
714
|
}
|
|
713
715
|
|
|
714
|
-
/**
|
|
715
|
-
* 修改表结构
|
|
716
|
-
*/
|
|
717
|
-
async alterTable(dataSource: DataSource, databaseName: string, tableDiff: any): Promise<any> {
|
|
718
|
-
try {
|
|
719
|
-
const tableName = tableDiff.tableName;
|
|
720
|
-
const sqlStatements: string[] = [];
|
|
721
|
-
|
|
722
|
-
// 修改表注释
|
|
723
|
-
if (tableDiff.tableCommentChanged) {
|
|
724
|
-
sqlStatements.push(`ALTER TABLE "${tableName}" COMMENT '${tableDiff.tableComment}'`);
|
|
725
|
-
}
|
|
726
|
-
|
|
727
|
-
// 添加新列
|
|
728
|
-
tableDiff.addedColumns.forEach((column: any) => {
|
|
729
|
-
// 检查type是否已经包含长度信息(括号)
|
|
730
|
-
const typeHasLength = /\(\d+\)/.test(column.type);
|
|
731
|
-
|
|
732
|
-
let columnSQL = `ALTER TABLE "${tableName}" ADD ("${column.name}" ${column.type}`;
|
|
733
|
-
|
|
734
|
-
// 处理长度和精度(仅当type中没有指定长度时才添加)
|
|
735
|
-
if (!typeHasLength) {
|
|
736
|
-
if (column.length) {
|
|
737
|
-
columnSQL += `(${column.length})`;
|
|
738
|
-
} else if (column.precision) {
|
|
739
|
-
if (column.scale) {
|
|
740
|
-
columnSQL += `(${column.precision},${column.scale})`;
|
|
741
|
-
} else {
|
|
742
|
-
columnSQL += `(${column.precision})`;
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
}
|
|
746
|
-
|
|
747
|
-
// 处理NULL约束
|
|
748
|
-
if (!column.nullable) {
|
|
749
|
-
columnSQL += ' NOT NULL';
|
|
750
|
-
}
|
|
751
|
-
|
|
752
|
-
// 处理默认值
|
|
753
|
-
if (column.defaultValue) {
|
|
754
|
-
const upperDefault = column.defaultValue.toString().toUpperCase();
|
|
755
|
-
if (['CURRENT_TIMESTAMP', 'CURRENT_DATE', 'CURRENT_TIME'].includes(upperDefault)) {
|
|
756
|
-
columnSQL += ` DEFAULT ${upperDefault}`;
|
|
757
|
-
} else {
|
|
758
|
-
columnSQL += ` DEFAULT '${column.defaultValue}'`;
|
|
759
|
-
}
|
|
760
|
-
}
|
|
761
|
-
|
|
762
|
-
columnSQL += ')';
|
|
763
|
-
sqlStatements.push(columnSQL + ';');
|
|
764
|
-
|
|
765
|
-
// 添加列注释
|
|
766
|
-
if (column.comment) {
|
|
767
|
-
sqlStatements.push(`ALTER TABLE "${tableName}" ("${column.name}" COMMENT '${column.comment}')`);
|
|
768
|
-
}
|
|
769
|
-
});
|
|
770
|
-
|
|
771
|
-
// 修改列
|
|
772
|
-
tableDiff.modifiedColumns.forEach((modification: any) => {
|
|
773
|
-
const { oldColumn, newColumn } = modification;
|
|
774
|
-
|
|
775
|
-
// 检查type是否已经包含长度信息(括号)
|
|
776
|
-
const typeHasLength = /\(\d+\)/.test(newColumn.type);
|
|
777
|
-
|
|
778
|
-
let columnSQL = `ALTER TABLE "${tableName}" ("${newColumn.name}" ${newColumn.type}`;
|
|
779
|
-
|
|
780
|
-
// 处理长度和精度(仅当type中没有指定长度时才添加)
|
|
781
|
-
if (!typeHasLength) {
|
|
782
|
-
if (newColumn.length) {
|
|
783
|
-
columnSQL += `(${newColumn.length})`;
|
|
784
|
-
} else if (newColumn.precision) {
|
|
785
|
-
if (newColumn.scale) {
|
|
786
|
-
columnSQL += `(${newColumn.precision},${newColumn.scale})`;
|
|
787
|
-
} else {
|
|
788
|
-
columnSQL += `(${newColumn.precision})`;
|
|
789
|
-
}
|
|
790
|
-
}
|
|
791
|
-
}
|
|
792
|
-
|
|
793
|
-
// 处理NULL约束
|
|
794
|
-
if (!newColumn.nullable) {
|
|
795
|
-
columnSQL += ' NOT NULL';
|
|
796
|
-
}
|
|
797
|
-
|
|
798
|
-
// 处理默认值
|
|
799
|
-
if (newColumn.defaultValue) {
|
|
800
|
-
const upperDefault = newColumn.defaultValue.toString().toUpperCase();
|
|
801
|
-
if (['CURRENT_TIMESTAMP', 'CURRENT_DATE', 'CURRENT_TIME'].includes(upperDefault)) {
|
|
802
|
-
columnSQL += ` DEFAULT ${upperDefault}`;
|
|
803
|
-
} else {
|
|
804
|
-
columnSQL += ` DEFAULT '${newColumn.defaultValue}'`;
|
|
805
|
-
}
|
|
806
|
-
}
|
|
807
|
-
|
|
808
|
-
columnSQL += ')';
|
|
809
|
-
sqlStatements.push(columnSQL + ';');
|
|
810
|
-
|
|
811
|
-
// 修改列注释
|
|
812
|
-
if (newColumn.comment) {
|
|
813
|
-
sqlStatements.push(`ALTER TABLE "${tableName}" ("${newColumn.name}" COMMENT '${newColumn.comment}')`);
|
|
814
|
-
}
|
|
815
|
-
});
|
|
816
|
-
|
|
817
|
-
// 删除列
|
|
818
|
-
tableDiff.deletedColumns.forEach((column: any) => {
|
|
819
|
-
sqlStatements.push(`ALTER TABLE "${tableName}" DROP ("${column.name}")`);
|
|
820
|
-
});
|
|
821
|
-
|
|
822
|
-
// 执行SQL语句
|
|
823
|
-
if (sqlStatements.length > 0) {
|
|
824
|
-
await this.executeBatchQuery(dataSource, sqlStatements, { useTransaction: true });
|
|
825
|
-
}
|
|
826
|
-
|
|
827
|
-
return { ret: 0, message: '表结构修改成功' };
|
|
828
|
-
} catch (error) {
|
|
829
|
-
console.error('SAP HANA修改表结构失败:', error);
|
|
830
|
-
return { ret: 1, message: `修改表结构失败: ${error instanceof Error ? error.message : String(error)}` };
|
|
831
|
-
}
|
|
832
|
-
}
|
|
833
716
|
|
|
834
717
|
/**
|
|
835
718
|
* 批量插入数据
|
|
@@ -877,46 +760,16 @@ export class SAPHANADatabaseService extends BaseDatabaseService {
|
|
|
877
760
|
*/
|
|
878
761
|
async createTable(dataSource: DataSource, databaseName: string, table: any): Promise<void> {
|
|
879
762
|
const { name, columns, comment } = table;
|
|
880
|
-
|
|
881
|
-
let sql = `CREATE COLUMN TABLE "${name}" (\n`;
|
|
882
|
-
const columnDefs: string[] = [];
|
|
883
763
|
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
if (column.defaultValue) {
|
|
892
|
-
const upperDefault = column.defaultValue.toString().toUpperCase();
|
|
893
|
-
if (['CURRENT_TIMESTAMP', 'CURRENT_DATE', 'CURRENT_TIME', 'SYSDATE'].includes(upperDefault)) {
|
|
894
|
-
columnDef += ` DEFAULT ${upperDefault}`;
|
|
895
|
-
} else {
|
|
896
|
-
columnDef += ` DEFAULT '${column.defaultValue}'`;
|
|
897
|
-
}
|
|
898
|
-
}
|
|
899
|
-
|
|
900
|
-
if (column.isAutoIncrement) {
|
|
901
|
-
columnDef += ' GENERATED BY DEFAULT AS IDENTITY';
|
|
902
|
-
}
|
|
903
|
-
|
|
904
|
-
if (column.comment) {
|
|
905
|
-
columnDef += ` COMMENT '${column.comment}'`;
|
|
906
|
-
}
|
|
907
|
-
|
|
908
|
-
columnDefs.push(columnDef);
|
|
764
|
+
// 统一走 emitCreateDdl:前端建表 / SQLite 重建 / syncTable 建表共用同一渲染出口。
|
|
765
|
+
// 顺带修复旧实现的既有缺陷:PG/CRDB 的 `int SERIAL` 与内联 COMMENT(语法错误)、
|
|
766
|
+
// SQLite 丢失主键、默认值假值兜底与一律加引号等。
|
|
767
|
+
const canonical = canonicalizeTableEntity({
|
|
768
|
+
name,
|
|
769
|
+
comment: comment ?? '',
|
|
770
|
+
columns: columns ?? []
|
|
909
771
|
});
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
sql += '\n)';
|
|
913
|
-
|
|
914
|
-
if (comment) {
|
|
915
|
-
sql += ` COMMENT '${comment}'`;
|
|
916
|
-
}
|
|
917
|
-
|
|
918
|
-
sql += ';';
|
|
919
|
-
|
|
920
|
-
await dataSource.query(sql);
|
|
772
|
+
const statements = emitCreateDdl('sap', canonical, { mssqlDatabase: databaseName });
|
|
773
|
+
await this.executeBatchQuery(dataSource, statements, { useTransaction: true });
|
|
921
774
|
}
|
|
922
775
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-type.helper.d.ts","sourceRoot":"","sources":["../../../../server/service/database/sql-type.helper.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"sql-type.helper.d.ts","sourceRoot":"","sources":["../../../../server/service/database/sql-type.helper.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,yBAAyB;AACzB,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AASD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,EAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,EAClC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAC7B,MAAM,CAkBR;AAED,yBAAyB;AACzB,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAElD;AAWD,2BAA2B;AAC3B,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAYrD;AAED,qCAAqC;AACrC,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAQvD"}
|
|
@@ -14,53 +14,15 @@ exports.escapeSqlString = escapeSqlString;
|
|
|
14
14
|
exports.isFunctionDefault = isFunctionDefault;
|
|
15
15
|
exports.formatDefaultLiteral = formatDefaultLiteral;
|
|
16
16
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
17
|
+
* 默认参数已统一到 core/schema/type-defaults(schema 引擎与此处共用同一份),
|
|
18
|
+
* 避免两处参数漂移;本文件只做 databaseType → DialectKind 的适配。
|
|
19
19
|
*/
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
integer: { length: 11 },
|
|
27
|
-
bigint: { length: 20 },
|
|
28
|
-
decimal: { precision: 10, scale: 2 },
|
|
29
|
-
float: { precision: 10, scale: 2 },
|
|
30
|
-
double: { precision: 16, scale: 4 },
|
|
31
|
-
bit: { length: 1 },
|
|
32
|
-
char: { length: 1 },
|
|
33
|
-
varchar: { length: 255 },
|
|
34
|
-
binary: { length: 1 },
|
|
35
|
-
varbinary: { length: 255 }
|
|
36
|
-
},
|
|
37
|
-
postgres: {
|
|
38
|
-
decimal: { precision: 10, scale: 2 },
|
|
39
|
-
numeric: { precision: 10, scale: 2 },
|
|
40
|
-
'character varying': { length: 255 },
|
|
41
|
-
varchar: { length: 255 },
|
|
42
|
-
character: { length: 1 },
|
|
43
|
-
char: { length: 1 }
|
|
44
|
-
},
|
|
45
|
-
mssql: {
|
|
46
|
-
decimal: { precision: 18, scale: 0 },
|
|
47
|
-
numeric: { precision: 18, scale: 0 },
|
|
48
|
-
float: { precision: 53 },
|
|
49
|
-
char: { length: 1 },
|
|
50
|
-
varchar: { length: 255 },
|
|
51
|
-
nchar: { length: 1 },
|
|
52
|
-
nvarchar: { length: 255 },
|
|
53
|
-
binary: { length: 1 },
|
|
54
|
-
varbinary: { length: 255 }
|
|
55
|
-
},
|
|
56
|
-
oracle: {
|
|
57
|
-
char: { length: 1 },
|
|
58
|
-
nchar: { length: 1 },
|
|
59
|
-
varchar2: { length: 4000 },
|
|
60
|
-
nvarchar2: { length: 2000 },
|
|
61
|
-
raw: { length: 2000 }
|
|
62
|
-
}
|
|
63
|
-
};
|
|
20
|
+
const dialect_1 = require("../../core/dialect");
|
|
21
|
+
const type_defaults_1 = require("../../core/schema/type-defaults");
|
|
22
|
+
/** 把用户/驱动传入的 databaseType(可能是 mariadb、sqlserver 等别名)归一为方言 */
|
|
23
|
+
function defaultFor(databaseType, type) {
|
|
24
|
+
return (0, type_defaults_1.typeParamDefault)((0, dialect_1.getDialectInfo)(databaseType).kind, type);
|
|
25
|
+
}
|
|
64
26
|
/** 类型是否已自带参数(如 VARCHAR(255)、DECIMAL(10,2)、ENUM('a','b')) */
|
|
65
27
|
function hasTypeParams(type) {
|
|
66
28
|
return !!type && type.includes('(');
|
|
@@ -92,7 +54,7 @@ function toNumber(value) {
|
|
|
92
54
|
function buildColumnType(databaseType, type, length, precision, scale) {
|
|
93
55
|
if (!type || hasTypeParams(type))
|
|
94
56
|
return type;
|
|
95
|
-
const defaults =
|
|
57
|
+
const defaults = defaultFor(databaseType, baseTypeName(type));
|
|
96
58
|
if (!defaults)
|
|
97
59
|
return type;
|
|
98
60
|
if (defaults.precision != null) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-type.helper.js","sourceRoot":"","sources":["../../../../server/service/database/sql-type.helper.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;
|
|
1
|
+
{"version":3,"file":"sql-type.helper.js","sourceRoot":"","sources":["../../../../server/service/database/sql-type.helper.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAgBH,sCAEC;AAGD,oCAKC;AAkBD,0CAwBC;AAGD,0CAEC;AAYD,8CAYC;AAGD,oDAQC;AA1GD;;;GAGG;AACH,gDAAoD;AACpD,mEAAmE;AAEnE,6DAA6D;AAC7D,SAAS,UAAU,CAAC,YAAoB,EAAE,IAAY;IACpD,OAAO,IAAA,gCAAgB,EAAC,IAAA,wBAAc,EAAC,YAAY,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACnE,CAAC;AAGD,4DAA4D;AAC5D,SAAgB,aAAa,CAAC,IAAY;IACxC,OAAO,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,yBAAyB;AACzB,SAAgB,YAAY,CAAC,IAAY;IACvC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAChC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACnC,CAAC;AAED,mCAAmC;AACnC,SAAS,QAAQ,CAAC,KAAyC;IACzD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACvE,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AACxC,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,eAAe,CAC7B,YAAoB,EACpB,IAAY,EACZ,MAA+B,EAC/B,SAAkC,EAClC,KAA8B;IAE9B,IAAI,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9C,MAAM,QAAQ,GAAG,UAAU,CAAC,YAAY,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,IAAI,QAAQ,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC;QACpD,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC;QAC5C,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IAC5D,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC;QAC9C,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yBAAyB;AACzB,SAAgB,eAAe,CAAC,KAAU;IACxC,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,qCAAqC;AACrC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,mBAAmB,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc;IAC5D,gBAAgB,EAAE,WAAW,EAAE,cAAc;IAC7C,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc;IACtD,eAAe,EAAE,qBAAqB,EAAE,kBAAkB;IAC1D,SAAS,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,oBAAoB;CAC1E,CAAC,CAAC;AAEH,2BAA2B;AAC3B,SAAgB,iBAAiB,CAAC,KAAU;IAC1C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACxD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAChC,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,sCAAsC;IACtC,IAAI,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5D,mCAAmC;IACnC,IAAI,qCAAqC,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,qCAAqC;AACrC,SAAgB,oBAAoB,CAAC,KAAU;IAC7C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACzE,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC;AACvC,CAAC"}
|
|
@@ -6,60 +6,18 @@
|
|
|
6
6
|
* 这里按数据库补齐默认参数;类型本身已带括号(如 ENUM('a','b')、DECIMAL(10,2))时原样返回。
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
interface TypeDefault {
|
|
10
|
-
length?: number;
|
|
11
|
-
precision?: number;
|
|
12
|
-
scale?: number;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
9
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
10
|
+
* 默认参数已统一到 core/schema/type-defaults(schema 引擎与此处共用同一份),
|
|
11
|
+
* 避免两处参数漂移;本文件只做 databaseType → DialectKind 的适配。
|
|
18
12
|
*/
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
decimal: { precision: 10, scale: 2 },
|
|
28
|
-
float: { precision: 10, scale: 2 },
|
|
29
|
-
double: { precision: 16, scale: 4 },
|
|
30
|
-
bit: { length: 1 },
|
|
31
|
-
char: { length: 1 },
|
|
32
|
-
varchar: { length: 255 },
|
|
33
|
-
binary: { length: 1 },
|
|
34
|
-
varbinary: { length: 255 }
|
|
35
|
-
},
|
|
36
|
-
postgres: {
|
|
37
|
-
decimal: { precision: 10, scale: 2 },
|
|
38
|
-
numeric: { precision: 10, scale: 2 },
|
|
39
|
-
'character varying': { length: 255 },
|
|
40
|
-
varchar: { length: 255 },
|
|
41
|
-
character: { length: 1 },
|
|
42
|
-
char: { length: 1 }
|
|
43
|
-
},
|
|
44
|
-
mssql: {
|
|
45
|
-
decimal: { precision: 18, scale: 0 },
|
|
46
|
-
numeric: { precision: 18, scale: 0 },
|
|
47
|
-
float: { precision: 53 },
|
|
48
|
-
char: { length: 1 },
|
|
49
|
-
varchar: { length: 255 },
|
|
50
|
-
nchar: { length: 1 },
|
|
51
|
-
nvarchar: { length: 255 },
|
|
52
|
-
binary: { length: 1 },
|
|
53
|
-
varbinary: { length: 255 }
|
|
54
|
-
},
|
|
55
|
-
oracle: {
|
|
56
|
-
char: { length: 1 },
|
|
57
|
-
nchar: { length: 1 },
|
|
58
|
-
varchar2: { length: 4000 },
|
|
59
|
-
nvarchar2: { length: 2000 },
|
|
60
|
-
raw: { length: 2000 }
|
|
61
|
-
}
|
|
62
|
-
};
|
|
13
|
+
import { getDialectInfo } from '../../core/dialect';
|
|
14
|
+
import { typeParamDefault } from '../../core/schema/type-defaults';
|
|
15
|
+
|
|
16
|
+
/** 把用户/驱动传入的 databaseType(可能是 mariadb、sqlserver 等别名)归一为方言 */
|
|
17
|
+
function defaultFor(databaseType: string, type: string) {
|
|
18
|
+
return typeParamDefault(getDialectInfo(databaseType).kind, type);
|
|
19
|
+
}
|
|
20
|
+
|
|
63
21
|
|
|
64
22
|
/** 类型是否已自带参数(如 VARCHAR(255)、DECIMAL(10,2)、ENUM('a','b')) */
|
|
65
23
|
export function hasTypeParams(type: string): boolean {
|
|
@@ -99,7 +57,7 @@ export function buildColumnType(
|
|
|
99
57
|
): string {
|
|
100
58
|
if (!type || hasTypeParams(type)) return type;
|
|
101
59
|
|
|
102
|
-
const defaults =
|
|
60
|
+
const defaults = defaultFor(databaseType, baseTypeName(type));
|
|
103
61
|
if (!defaults) return type;
|
|
104
62
|
|
|
105
63
|
if (defaults.precision != null) {
|
|
@@ -87,11 +87,6 @@ export declare class SQLiteService extends BaseDatabaseService {
|
|
|
87
87
|
* 导出表数据到 Excel 文件
|
|
88
88
|
*/
|
|
89
89
|
exportTableDataToExcel(dataSource: DataSource, databaseName: string, tableName: string, options?: any): Promise<string>;
|
|
90
|
-
/**
|
|
91
|
-
* 修改表结构
|
|
92
|
-
* SQLite的ALTER TABLE操作非常有限,需要通过重建表来实现复杂的表结构修改
|
|
93
|
-
*/
|
|
94
|
-
alterTable(dataSource: DataSource, databaseName: string, tableDiff: any): Promise<any>;
|
|
95
90
|
/**
|
|
96
91
|
* 批量插入数据
|
|
97
92
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.service.d.ts","sourceRoot":"","sources":["../../../../server/service/database/sqlite.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EACL,WAAW,EACX,YAAY,EACZ,WAAW,EACX,gBAAgB,EACjB,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlite.service.d.ts","sourceRoot":"","sources":["../../../../server/service/database/sqlite.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,7 +37,8 @@ exports.SQLiteService = void 0;
|
|
|
37
37
|
const fs = __importStar(require("fs"));
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
39
|
const base_service_1 = require("./base.service");
|
|
40
|
-
const
|
|
40
|
+
const canonical_1 = require("../../core/schema/canonical");
|
|
41
|
+
const ddl_emitter_1 = require("../../core/schema/ddl-emitter");
|
|
41
42
|
/**
|
|
42
43
|
* SQLite数据库服务实现
|
|
43
44
|
*/
|
|
@@ -527,129 +528,6 @@ class SQLiteService extends base_service_1.BaseDatabaseService {
|
|
|
527
528
|
throw new Error(`导出表数据到Excel失败: ${error.message}`);
|
|
528
529
|
}
|
|
529
530
|
}
|
|
530
|
-
/**
|
|
531
|
-
* 修改表结构
|
|
532
|
-
* SQLite的ALTER TABLE操作非常有限,需要通过重建表来实现复杂的表结构修改
|
|
533
|
-
*/
|
|
534
|
-
async alterTable(dataSource, databaseName, tableDiff) {
|
|
535
|
-
try {
|
|
536
|
-
const tableName = tableDiff.tableName;
|
|
537
|
-
const sqlStatements = [];
|
|
538
|
-
const renamedColumns = tableDiff.renamedColumns || [];
|
|
539
|
-
const modifiedColumns = tableDiff.modifiedColumns || [];
|
|
540
|
-
const deletedColumns = tableDiff.deletedColumns || [];
|
|
541
|
-
const addedColumns = tableDiff.addedColumns || [];
|
|
542
|
-
// SQLite不支持直接修改表注释,只能忽略
|
|
543
|
-
// 如果有修改或删除列,需要重建表(重命名也一并纳入,避免丢数据)
|
|
544
|
-
if (modifiedColumns.length > 0 || deletedColumns.length > 0 || renamedColumns.length > 0) {
|
|
545
|
-
const tempTableName = `_temp_${tableName}_${Date.now()}`;
|
|
546
|
-
// 获取现有的全部列
|
|
547
|
-
const existingColumns = await this.getColumns(dataSource, databaseName, tableName);
|
|
548
|
-
// 建立「旧列名 → 新列定义」映射
|
|
549
|
-
const renamedMap = new Map();
|
|
550
|
-
renamedColumns.forEach(({ oldColumn, newColumn }) => {
|
|
551
|
-
renamedMap.set(oldColumn.name, newColumn);
|
|
552
|
-
});
|
|
553
|
-
const modifiedMap = new Map();
|
|
554
|
-
modifiedColumns.forEach((modification) => {
|
|
555
|
-
if (!renamedMap.has(modification.oldColumn.name)) {
|
|
556
|
-
modifiedMap.set(modification.oldColumn.name, modification.newColumn);
|
|
557
|
-
}
|
|
558
|
-
});
|
|
559
|
-
const deletedNames = new Set(deletedColumns.map((col) => col.name));
|
|
560
|
-
// 逐列建立「新列 ← 旧表达式」映射,保证 INSERT 列与 SELECT 表达式严格一一对应
|
|
561
|
-
const pairs = [];
|
|
562
|
-
const pushColumn = (column, sourceExpr) => {
|
|
563
|
-
pairs.push({ column, expr: sourceExpr });
|
|
564
|
-
};
|
|
565
|
-
existingColumns.forEach(col => {
|
|
566
|
-
if (deletedNames.has(col.name))
|
|
567
|
-
return; // 删除的列不迁移
|
|
568
|
-
const renamed = renamedMap.get(col.name);
|
|
569
|
-
const modified = modifiedMap.get(col.name);
|
|
570
|
-
// 无论是否改名/修改,都从旧列取值,保证原有数据不丢失
|
|
571
|
-
pushColumn(renamed || modified || col, `"${col.name}"`);
|
|
572
|
-
});
|
|
573
|
-
// 全新增的列没有旧数据,用默认值(无默认值则为 NULL)占位
|
|
574
|
-
const addedNames = new Set();
|
|
575
|
-
addedColumns.forEach((col) => {
|
|
576
|
-
if (addedNames.has(col.name))
|
|
577
|
-
return;
|
|
578
|
-
addedNames.add(col.name);
|
|
579
|
-
pushColumn(col, col.defaultValue ? (0, sql_type_helper_1.formatDefaultLiteral)(col.defaultValue) : 'NULL');
|
|
580
|
-
});
|
|
581
|
-
// 按前端给出的新列顺序排列,保证重建后列顺序与界面一致
|
|
582
|
-
const columnOrder = Array.isArray(tableDiff.columnOrder) ? tableDiff.columnOrder : [];
|
|
583
|
-
if (columnOrder.length > 0) {
|
|
584
|
-
pairs.sort((a, b) => {
|
|
585
|
-
const ia = columnOrder.indexOf(a.column.name);
|
|
586
|
-
const ib = columnOrder.indexOf(b.column.name);
|
|
587
|
-
return (ia === -1 ? Number.MAX_SAFE_INTEGER : ia) - (ib === -1 ? Number.MAX_SAFE_INTEGER : ib);
|
|
588
|
-
});
|
|
589
|
-
}
|
|
590
|
-
// 创建临时表
|
|
591
|
-
let createTableSQL = `CREATE TABLE "${tempTableName}" (`;
|
|
592
|
-
const columnDefinitions = [];
|
|
593
|
-
pairs.forEach(({ column }) => {
|
|
594
|
-
// SQLite 的 VARCHAR 等不带长度也合法,此处仅处理已填写的参数
|
|
595
|
-
const columnType = (0, sql_type_helper_1.buildColumnType)('sqlite', column.type, column.length, column.precision, column.scale);
|
|
596
|
-
let definition = `"${column.name}" ${columnType}`;
|
|
597
|
-
// 处理NULL约束
|
|
598
|
-
if (!column.nullable) {
|
|
599
|
-
definition += ' NOT NULL';
|
|
600
|
-
}
|
|
601
|
-
// 处理默认值
|
|
602
|
-
if (column.defaultValue) {
|
|
603
|
-
definition += ` DEFAULT ${(0, sql_type_helper_1.formatDefaultLiteral)(column.defaultValue)}`;
|
|
604
|
-
}
|
|
605
|
-
// 处理主键和自增
|
|
606
|
-
if (column.isPrimary) {
|
|
607
|
-
if (column.isAutoIncrement) {
|
|
608
|
-
definition += ' PRIMARY KEY AUTOINCREMENT';
|
|
609
|
-
}
|
|
610
|
-
else {
|
|
611
|
-
definition += ' PRIMARY KEY';
|
|
612
|
-
}
|
|
613
|
-
}
|
|
614
|
-
columnDefinitions.push(definition);
|
|
615
|
-
});
|
|
616
|
-
createTableSQL += columnDefinitions.join(',\n');
|
|
617
|
-
createTableSQL += ')';
|
|
618
|
-
sqlStatements.push(createTableSQL + ';');
|
|
619
|
-
// 复制数据到临时表(列与表达式一一对应,重命名/新增都不会错位)
|
|
620
|
-
sqlStatements.push(`INSERT INTO "${tempTableName}" (${pairs.map(p => `"${p.column.name}"`).join(', ')}) SELECT ${pairs.map(p => p.expr).join(', ')} FROM "${tableName}";`);
|
|
621
|
-
// 删除旧表
|
|
622
|
-
sqlStatements.push(`DROP TABLE "${tableName}";`);
|
|
623
|
-
// 重命名临时表
|
|
624
|
-
sqlStatements.push(`ALTER TABLE "${tempTableName}" RENAME TO "${tableName}";`);
|
|
625
|
-
}
|
|
626
|
-
else if (addedColumns.length > 0) {
|
|
627
|
-
// 只有添加列,可以直接使用ALTER TABLE ADD COLUMN
|
|
628
|
-
tableDiff.addedColumns.forEach((column) => {
|
|
629
|
-
const columnType = (0, sql_type_helper_1.buildColumnType)('sqlite', column.type, column.length, column.precision, column.scale);
|
|
630
|
-
let columnSQL = `ALTER TABLE "${tableName}" ADD COLUMN "${column.name}" ${columnType}`;
|
|
631
|
-
// 处理NULL约束
|
|
632
|
-
if (!column.nullable) {
|
|
633
|
-
columnSQL += ' NOT NULL';
|
|
634
|
-
}
|
|
635
|
-
// 处理默认值
|
|
636
|
-
if (column.defaultValue) {
|
|
637
|
-
columnSQL += ` DEFAULT ${(0, sql_type_helper_1.formatDefaultLiteral)(column.defaultValue)}`;
|
|
638
|
-
}
|
|
639
|
-
sqlStatements.push(columnSQL + ';');
|
|
640
|
-
});
|
|
641
|
-
}
|
|
642
|
-
// 执行SQL语句
|
|
643
|
-
if (sqlStatements.length > 0) {
|
|
644
|
-
await this.executeBatchQuery(dataSource, sqlStatements, { useTransaction: true });
|
|
645
|
-
}
|
|
646
|
-
return { ret: 0, message: '表结构修改成功' };
|
|
647
|
-
}
|
|
648
|
-
catch (error) {
|
|
649
|
-
console.error('SQLite修改表结构失败:', error);
|
|
650
|
-
return { ret: 1, message: `修改表结构失败: ${error instanceof Error ? error.message : String(error)}` };
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
531
|
/**
|
|
654
532
|
* 批量插入数据
|
|
655
533
|
*/
|
|
@@ -684,30 +562,16 @@ class SQLiteService extends base_service_1.BaseDatabaseService {
|
|
|
684
562
|
*/
|
|
685
563
|
async createTable(dataSource, databaseName, table) {
|
|
686
564
|
const { name, columns, comment } = table;
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
if (column.defaultValue) {
|
|
695
|
-
const upperDefault = column.defaultValue.toString().toUpperCase();
|
|
696
|
-
if (['CURRENT_TIMESTAMP', 'CURRENT_DATE', 'CURRENT_TIME'].includes(upperDefault)) {
|
|
697
|
-
columnDef += ` DEFAULT ${upperDefault}`;
|
|
698
|
-
}
|
|
699
|
-
else {
|
|
700
|
-
columnDef += ` DEFAULT '${column.defaultValue}'`;
|
|
701
|
-
}
|
|
702
|
-
}
|
|
703
|
-
if (column.isAutoIncrement) {
|
|
704
|
-
columnDef += ' AUTOINCREMENT';
|
|
705
|
-
}
|
|
706
|
-
columnDefs.push(columnDef);
|
|
565
|
+
// 统一走 emitCreateDdl:前端建表 / SQLite 重建 / syncTable 建表共用同一渲染出口。
|
|
566
|
+
// 顺带修复旧实现的既有缺陷:PG/CRDB 的 `int SERIAL` 与内联 COMMENT(语法错误)、
|
|
567
|
+
// SQLite 丢失主键、默认值假值兜底与一律加引号等。
|
|
568
|
+
const canonical = (0, canonical_1.canonicalizeTableEntity)({
|
|
569
|
+
name,
|
|
570
|
+
comment: comment ?? '',
|
|
571
|
+
columns: columns ?? []
|
|
707
572
|
});
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
await dataSource.query(sql);
|
|
573
|
+
const statements = (0, ddl_emitter_1.emitCreateDdl)('sqlite', canonical, { mssqlDatabase: databaseName });
|
|
574
|
+
await this.executeBatchQuery(dataSource, statements, { useTransaction: true });
|
|
711
575
|
}
|
|
712
576
|
}
|
|
713
577
|
exports.SQLiteService = SQLiteService;
|