@codemastersolutions/db-utility 0.0.1
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/LICENSE +21 -0
- package/LICENSE.es +21 -0
- package/LICENSE.pt-BR +21 -0
- package/README.es.md +155 -0
- package/README.md +155 -0
- package/README.pt-BR.md +155 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +314 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/AppConfig.d.ts +19 -0
- package/dist/config/AppConfig.d.ts.map +1 -0
- package/dist/config/AppConfig.js +142 -0
- package/dist/config/AppConfig.js.map +1 -0
- package/dist/config/ConfigInitializer.d.ts +10 -0
- package/dist/config/ConfigInitializer.d.ts.map +1 -0
- package/dist/config/ConfigInitializer.js +37 -0
- package/dist/config/ConfigInitializer.js.map +1 -0
- package/dist/config/ConfigLoader.d.ts +7 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -0
- package/dist/config/ConfigLoader.js +94 -0
- package/dist/config/ConfigLoader.js.map +1 -0
- package/dist/database/ConnectionFactory.d.ts +5 -0
- package/dist/database/ConnectionFactory.d.ts.map +1 -0
- package/dist/database/ConnectionFactory.js +22 -0
- package/dist/database/ConnectionFactory.js.map +1 -0
- package/dist/database/SqlSafety.d.ts +7 -0
- package/dist/database/SqlSafety.d.ts.map +1 -0
- package/dist/database/SqlSafety.js +47 -0
- package/dist/database/SqlSafety.js.map +1 -0
- package/dist/database/connectors/MssqlConnector.d.ts +13 -0
- package/dist/database/connectors/MssqlConnector.d.ts.map +1 -0
- package/dist/database/connectors/MssqlConnector.js +72 -0
- package/dist/database/connectors/MssqlConnector.js.map +1 -0
- package/dist/database/connectors/MysqlConnector.d.ts +12 -0
- package/dist/database/connectors/MysqlConnector.d.ts.map +1 -0
- package/dist/database/connectors/MysqlConnector.js +70 -0
- package/dist/database/connectors/MysqlConnector.js.map +1 -0
- package/dist/database/connectors/PostgresConnector.d.ts +12 -0
- package/dist/database/connectors/PostgresConnector.d.ts.map +1 -0
- package/dist/database/connectors/PostgresConnector.js +65 -0
- package/dist/database/connectors/PostgresConnector.js.map +1 -0
- package/dist/errors/DbUtilityError.d.ts +7 -0
- package/dist/errors/DbUtilityError.d.ts.map +1 -0
- package/dist/errors/DbUtilityError.js +15 -0
- package/dist/errors/DbUtilityError.js.map +1 -0
- package/dist/generators/GeneratorTypes.d.ts +15 -0
- package/dist/generators/GeneratorTypes.d.ts.map +1 -0
- package/dist/generators/GeneratorTypes.js +3 -0
- package/dist/generators/GeneratorTypes.js.map +1 -0
- package/dist/generators/GeneratorWriter.d.ts +6 -0
- package/dist/generators/GeneratorWriter.d.ts.map +1 -0
- package/dist/generators/GeneratorWriter.js +25 -0
- package/dist/generators/GeneratorWriter.js.map +1 -0
- package/dist/generators/MongooseGenerator.d.ts +10 -0
- package/dist/generators/MongooseGenerator.d.ts.map +1 -0
- package/dist/generators/MongooseGenerator.js +75 -0
- package/dist/generators/MongooseGenerator.js.map +1 -0
- package/dist/generators/PrismaGenerator.d.ts +9 -0
- package/dist/generators/PrismaGenerator.d.ts.map +1 -0
- package/dist/generators/PrismaGenerator.js +87 -0
- package/dist/generators/PrismaGenerator.js.map +1 -0
- package/dist/generators/SequelizeGenerator.d.ts +12 -0
- package/dist/generators/SequelizeGenerator.d.ts.map +1 -0
- package/dist/generators/SequelizeGenerator.js +243 -0
- package/dist/generators/SequelizeGenerator.js.map +1 -0
- package/dist/generators/TypeORMGenerator.d.ts +12 -0
- package/dist/generators/TypeORMGenerator.d.ts.map +1 -0
- package/dist/generators/TypeORMGenerator.js +216 -0
- package/dist/generators/TypeORMGenerator.js.map +1 -0
- package/dist/i18n/messages.d.ts +49 -0
- package/dist/i18n/messages.d.ts.map +1 -0
- package/dist/i18n/messages.js +149 -0
- package/dist/i18n/messages.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/introspection/DataExtractor.d.ts +10 -0
- package/dist/introspection/DataExtractor.d.ts.map +1 -0
- package/dist/introspection/DataExtractor.js +52 -0
- package/dist/introspection/DataExtractor.js.map +1 -0
- package/dist/introspection/IntrospectionLogger.d.ts +7 -0
- package/dist/introspection/IntrospectionLogger.d.ts.map +1 -0
- package/dist/introspection/IntrospectionLogger.js +30 -0
- package/dist/introspection/IntrospectionLogger.js.map +1 -0
- package/dist/introspection/IntrospectionService.d.ts +10 -0
- package/dist/introspection/IntrospectionService.d.ts.map +1 -0
- package/dist/introspection/IntrospectionService.js +37 -0
- package/dist/introspection/IntrospectionService.js.map +1 -0
- package/dist/introspection/Introspector.d.ts +11 -0
- package/dist/introspection/Introspector.d.ts.map +1 -0
- package/dist/introspection/Introspector.js +11 -0
- package/dist/introspection/Introspector.js.map +1 -0
- package/dist/introspection/MssqlIntrospector.d.ts +11 -0
- package/dist/introspection/MssqlIntrospector.d.ts.map +1 -0
- package/dist/introspection/MssqlIntrospector.js +193 -0
- package/dist/introspection/MssqlIntrospector.js.map +1 -0
- package/dist/introspection/MysqlIntrospector.d.ts +10 -0
- package/dist/introspection/MysqlIntrospector.d.ts.map +1 -0
- package/dist/introspection/MysqlIntrospector.js +175 -0
- package/dist/introspection/MysqlIntrospector.js.map +1 -0
- package/dist/introspection/PostgresIntrospector.d.ts +11 -0
- package/dist/introspection/PostgresIntrospector.d.ts.map +1 -0
- package/dist/introspection/PostgresIntrospector.js +192 -0
- package/dist/introspection/PostgresIntrospector.js.map +1 -0
- package/dist/testing/ContainerManager.d.ts +7 -0
- package/dist/testing/ContainerManager.d.ts.map +1 -0
- package/dist/testing/ContainerManager.js +68 -0
- package/dist/testing/ContainerManager.js.map +1 -0
- package/dist/testing/MigrationTester.d.ts +18 -0
- package/dist/testing/MigrationTester.d.ts.map +1 -0
- package/dist/testing/MigrationTester.js +399 -0
- package/dist/testing/MigrationTester.js.map +1 -0
- package/dist/testing/runners/MigrationRunner.d.ts +5 -0
- package/dist/testing/runners/MigrationRunner.d.ts.map +1 -0
- package/dist/testing/runners/MigrationRunner.js +3 -0
- package/dist/testing/runners/MigrationRunner.js.map +1 -0
- package/dist/testing/runners/SequelizeRunner.d.ts +8 -0
- package/dist/testing/runners/SequelizeRunner.d.ts.map +1 -0
- package/dist/testing/runners/SequelizeRunner.js +71 -0
- package/dist/testing/runners/SequelizeRunner.js.map +1 -0
- package/dist/testing/runners/TypeORMRunner.d.ts +8 -0
- package/dist/testing/runners/TypeORMRunner.d.ts.map +1 -0
- package/dist/testing/runners/TypeORMRunner.js +91 -0
- package/dist/testing/runners/TypeORMRunner.js.map +1 -0
- package/dist/types/database.d.ts +22 -0
- package/dist/types/database.d.ts.map +1 -0
- package/dist/types/database.js +3 -0
- package/dist/types/database.js.map +1 -0
- package/dist/types/introspection.d.ts +43 -0
- package/dist/types/introspection.d.ts.map +1 -0
- package/dist/types/introspection.js +3 -0
- package/dist/types/introspection.js.map +1 -0
- package/dist/utils/PackageManager.d.ts +13 -0
- package/dist/utils/PackageManager.d.ts.map +1 -0
- package/dist/utils/PackageManager.js +114 -0
- package/dist/utils/PackageManager.js.map +1 -0
- package/dist/utils/topologicalSort.d.ts +3 -0
- package/dist/utils/topologicalSort.d.ts.map +1 -0
- package/dist/utils/topologicalSort.js +37 -0
- package/dist/utils/topologicalSort.js.map +1 -0
- package/package.json +98 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IntrospectionService.js","sourceRoot":"","sources":["../../src/introspection/IntrospectionService.ts"],"names":[],"mappings":";;;AAAA,6DAA0D;AAI1D,2DAAwD;AACxD,2DAAwD;AACxD,iEAA8D;AAE9D,MAAa,oBAAoB;IACvB,SAAS,CAAqB;IAC9B,MAAM,CAAiB;IAE/B,YAAY,SAA6B,EAAE,MAAsB;QAC/D,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,+BAAc,CAAC,gCAAgC,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,gBAAgB,EAAE,CAAC;QACrD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,kBAAkB;QACxB,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACzB,KAAK,UAAU;gBACb,OAAO,IAAI,2CAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClD,KAAK,OAAO;gBACV,OAAO,IAAI,qCAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,KAAK,OAAO;gBACV,OAAO,IAAI,qCAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C;gBACE,MAAM,IAAI,+BAAc,CAAC,mCAAmC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;CACF;AA/BD,oDA+BC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DatabaseSchema } from '../types/introspection';
|
|
2
|
+
import { IDatabaseConnector } from '../types/database';
|
|
3
|
+
export interface IDatabaseIntrospector {
|
|
4
|
+
introspectSchema(): Promise<DatabaseSchema>;
|
|
5
|
+
}
|
|
6
|
+
export declare abstract class BaseIntrospector implements IDatabaseIntrospector {
|
|
7
|
+
protected connector: IDatabaseConnector;
|
|
8
|
+
constructor(connector: IDatabaseConnector);
|
|
9
|
+
abstract introspectSchema(): Promise<DatabaseSchema>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=Introspector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Introspector.d.ts","sourceRoot":"","sources":["../../src/introspection/Introspector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;CAC7C;AAED,8BAAsB,gBAAiB,YAAW,qBAAqB;IACrE,SAAS,CAAC,SAAS,EAAE,kBAAkB,CAAC;gBAE5B,SAAS,EAAE,kBAAkB;IAIzC,QAAQ,CAAC,gBAAgB,IAAI,OAAO,CAAC,cAAc,CAAC;CACrD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseIntrospector = void 0;
|
|
4
|
+
class BaseIntrospector {
|
|
5
|
+
connector;
|
|
6
|
+
constructor(connector) {
|
|
7
|
+
this.connector = connector;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.BaseIntrospector = BaseIntrospector;
|
|
11
|
+
//# sourceMappingURL=Introspector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Introspector.js","sourceRoot":"","sources":["../../src/introspection/Introspector.ts"],"names":[],"mappings":";;;AAOA,MAAsB,gBAAgB;IAC1B,SAAS,CAAqB;IAExC,YAAY,SAA6B;QACvC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CAGF;AARD,4CAQC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BaseIntrospector } from './Introspector';
|
|
2
|
+
import { DatabaseSchema } from '../types/introspection';
|
|
3
|
+
export declare class MssqlIntrospector extends BaseIntrospector {
|
|
4
|
+
introspectSchema(): Promise<DatabaseSchema>;
|
|
5
|
+
private loadTables;
|
|
6
|
+
private loadColumns;
|
|
7
|
+
private loadPrimaryKeys;
|
|
8
|
+
private loadIndexes;
|
|
9
|
+
private loadForeignKeys;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=MssqlIntrospector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MssqlIntrospector.d.ts","sourceRoot":"","sources":["../../src/introspection/MssqlIntrospector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAEL,cAAc,EAIf,MAAM,wBAAwB,CAAC;AAyChC,qBAAa,iBAAkB,SAAQ,gBAAgB;IAC/C,gBAAgB,IAAI,OAAO,CAAC,cAAc,CAAC;YA4GnC,UAAU;YAWV,WAAW;YAkBX,eAAe;YAef,WAAW;YAyBX,eAAe;CA8B9B"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MssqlIntrospector = void 0;
|
|
4
|
+
const Introspector_1 = require("./Introspector");
|
|
5
|
+
class MssqlIntrospector extends Introspector_1.BaseIntrospector {
|
|
6
|
+
async introspectSchema() {
|
|
7
|
+
const tables = await this.loadTables();
|
|
8
|
+
const columns = await this.loadColumns();
|
|
9
|
+
const primaryKeys = await this.loadPrimaryKeys();
|
|
10
|
+
const indexes = await this.loadIndexes();
|
|
11
|
+
const foreignKeys = await this.loadForeignKeys();
|
|
12
|
+
const tableMap = new Map();
|
|
13
|
+
tables.forEach((t) => {
|
|
14
|
+
tableMap.set(t.table_name, {
|
|
15
|
+
name: t.table_name,
|
|
16
|
+
columns: [],
|
|
17
|
+
indexes: [],
|
|
18
|
+
foreignKeys: [],
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
const pkColumnsByTable = new Map();
|
|
22
|
+
primaryKeys.forEach((pk) => {
|
|
23
|
+
if (!pkColumnsByTable.has(pk.table_name)) {
|
|
24
|
+
pkColumnsByTable.set(pk.table_name, new Set());
|
|
25
|
+
}
|
|
26
|
+
pkColumnsByTable.get(pk.table_name)?.add(pk.column_name);
|
|
27
|
+
});
|
|
28
|
+
columns.forEach((c) => {
|
|
29
|
+
const table = tableMap.get(c.table_name);
|
|
30
|
+
if (!table)
|
|
31
|
+
return;
|
|
32
|
+
const pkSet = pkColumnsByTable.get(c.table_name);
|
|
33
|
+
const column = {
|
|
34
|
+
name: c.column_name,
|
|
35
|
+
dataType: c.data_type,
|
|
36
|
+
isNullable: c.is_nullable === 'YES',
|
|
37
|
+
hasDefault: c.column_default !== null,
|
|
38
|
+
defaultValue: c.column_default,
|
|
39
|
+
isPrimaryKey: pkSet ? pkSet.has(c.column_name) : false,
|
|
40
|
+
isUnique: false,
|
|
41
|
+
isAutoIncrement: false,
|
|
42
|
+
maxLength: c.character_maximum_length,
|
|
43
|
+
numericPrecision: c.numeric_precision,
|
|
44
|
+
numericScale: c.numeric_scale,
|
|
45
|
+
};
|
|
46
|
+
table.columns.push(column);
|
|
47
|
+
});
|
|
48
|
+
const indexMap = new Map();
|
|
49
|
+
indexes.forEach((i) => {
|
|
50
|
+
const key = `${i.table_name}:${i.index_name}`;
|
|
51
|
+
if (!indexMap.has(key)) {
|
|
52
|
+
indexMap.set(key, {
|
|
53
|
+
name: i.index_name,
|
|
54
|
+
columns: [],
|
|
55
|
+
isUnique: i.is_unique,
|
|
56
|
+
isPrimary: i.is_primary,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const entry = indexMap.get(key);
|
|
60
|
+
if (!entry)
|
|
61
|
+
return;
|
|
62
|
+
entry.columns.push(i.column_name);
|
|
63
|
+
});
|
|
64
|
+
indexMap.forEach((idx, key) => {
|
|
65
|
+
const tableName = key.split(':')[0];
|
|
66
|
+
const table = tableMap.get(tableName);
|
|
67
|
+
if (!table)
|
|
68
|
+
return;
|
|
69
|
+
table.indexes.push(idx);
|
|
70
|
+
});
|
|
71
|
+
const fkMap = new Map();
|
|
72
|
+
foreignKeys.forEach((fk) => {
|
|
73
|
+
const key = `${fk.table_name}:${fk.constraint_name}`;
|
|
74
|
+
if (!fkMap.has(key)) {
|
|
75
|
+
fkMap.set(key, {
|
|
76
|
+
name: fk.constraint_name,
|
|
77
|
+
tableName: fk.table_name,
|
|
78
|
+
columns: [],
|
|
79
|
+
referencedTable: fk.referenced_table_name,
|
|
80
|
+
referencedColumns: [],
|
|
81
|
+
updateRule: fk.update_rule,
|
|
82
|
+
deleteRule: fk.delete_rule,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
const entry = fkMap.get(key);
|
|
86
|
+
if (!entry)
|
|
87
|
+
return;
|
|
88
|
+
entry.columns.push(fk.column_name);
|
|
89
|
+
entry.referencedColumns.push(fk.referenced_column_name);
|
|
90
|
+
});
|
|
91
|
+
fkMap.forEach((fk) => {
|
|
92
|
+
const table = tableMap.get(fk.tableName);
|
|
93
|
+
if (!table)
|
|
94
|
+
return;
|
|
95
|
+
table.foreignKeys.push(fk);
|
|
96
|
+
});
|
|
97
|
+
return {
|
|
98
|
+
tables: Array.from(tableMap.values()),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
async loadTables() {
|
|
102
|
+
const sql = `
|
|
103
|
+
SELECT TABLE_NAME AS table_name
|
|
104
|
+
FROM INFORMATION_SCHEMA.TABLES
|
|
105
|
+
WHERE TABLE_TYPE = 'BASE TABLE'
|
|
106
|
+
ORDER BY TABLE_NAME
|
|
107
|
+
`;
|
|
108
|
+
return this.connector.query(sql);
|
|
109
|
+
}
|
|
110
|
+
async loadColumns() {
|
|
111
|
+
const sql = `
|
|
112
|
+
SELECT
|
|
113
|
+
TABLE_NAME AS table_name,
|
|
114
|
+
COLUMN_NAME AS column_name,
|
|
115
|
+
DATA_TYPE AS data_type,
|
|
116
|
+
IS_NULLABLE AS is_nullable,
|
|
117
|
+
COLUMN_DEFAULT AS column_default,
|
|
118
|
+
CHARACTER_MAXIMUM_LENGTH AS character_maximum_length,
|
|
119
|
+
NUMERIC_PRECISION AS numeric_precision,
|
|
120
|
+
NUMERIC_SCALE AS numeric_scale
|
|
121
|
+
FROM INFORMATION_SCHEMA.COLUMNS
|
|
122
|
+
ORDER BY TABLE_NAME, ORDINAL_POSITION
|
|
123
|
+
`;
|
|
124
|
+
return this.connector.query(sql);
|
|
125
|
+
}
|
|
126
|
+
async loadPrimaryKeys() {
|
|
127
|
+
const sql = `
|
|
128
|
+
SELECT
|
|
129
|
+
ku.table_name,
|
|
130
|
+
ku.column_name
|
|
131
|
+
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc
|
|
132
|
+
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS ku
|
|
133
|
+
ON tc.CONSTRAINT_NAME = ku.CONSTRAINT_NAME
|
|
134
|
+
WHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
|
|
135
|
+
ORDER BY ku.table_name, ku.ordinal_position
|
|
136
|
+
`;
|
|
137
|
+
return this.connector.query(sql);
|
|
138
|
+
}
|
|
139
|
+
async loadIndexes() {
|
|
140
|
+
const sql = `
|
|
141
|
+
SELECT
|
|
142
|
+
t.name AS table_name,
|
|
143
|
+
ind.name AS index_name,
|
|
144
|
+
ind.is_unique,
|
|
145
|
+
ind.is_primary_key AS is_primary,
|
|
146
|
+
col.name AS column_name,
|
|
147
|
+
ic.key_ordinal
|
|
148
|
+
FROM sys.indexes ind
|
|
149
|
+
INNER JOIN sys.index_columns ic
|
|
150
|
+
ON ind.object_id = ic.object_id
|
|
151
|
+
AND ind.index_id = ic.index_id
|
|
152
|
+
INNER JOIN sys.columns col
|
|
153
|
+
ON ic.object_id = col.object_id
|
|
154
|
+
AND ic.column_id = col.column_id
|
|
155
|
+
INNER JOIN sys.tables t
|
|
156
|
+
ON ind.object_id = t.object_id
|
|
157
|
+
WHERE t.is_ms_shipped = 0
|
|
158
|
+
ORDER BY t.name, ind.name, ic.key_ordinal
|
|
159
|
+
`;
|
|
160
|
+
return this.connector.query(sql);
|
|
161
|
+
}
|
|
162
|
+
async loadForeignKeys() {
|
|
163
|
+
const sql = `
|
|
164
|
+
SELECT
|
|
165
|
+
fk.name AS constraint_name,
|
|
166
|
+
tp.name AS table_name,
|
|
167
|
+
cp.name AS column_name,
|
|
168
|
+
tr.name AS referenced_table_name,
|
|
169
|
+
cr.name AS referenced_column_name,
|
|
170
|
+
rc.UPDATE_RULE AS update_rule,
|
|
171
|
+
rc.DELETE_RULE AS delete_rule
|
|
172
|
+
FROM sys.foreign_keys fk
|
|
173
|
+
INNER JOIN sys.foreign_key_columns fkc
|
|
174
|
+
ON fk.object_id = fkc.constraint_object_id
|
|
175
|
+
INNER JOIN sys.tables tp
|
|
176
|
+
ON fkc.parent_object_id = tp.object_id
|
|
177
|
+
INNER JOIN sys.columns cp
|
|
178
|
+
ON fkc.parent_object_id = cp.object_id
|
|
179
|
+
AND fkc.parent_column_id = cp.column_id
|
|
180
|
+
INNER JOIN sys.tables tr
|
|
181
|
+
ON fkc.referenced_object_id = tr.object_id
|
|
182
|
+
INNER JOIN sys.columns cr
|
|
183
|
+
ON fkc.referenced_object_id = cr.object_id
|
|
184
|
+
AND fkc.referenced_column_id = cr.column_id
|
|
185
|
+
INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
|
|
186
|
+
ON fk.name = rc.CONSTRAINT_NAME
|
|
187
|
+
ORDER BY tp.name, fk.name, fkc.constraint_column_id
|
|
188
|
+
`;
|
|
189
|
+
return this.connector.query(sql);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
exports.MssqlIntrospector = MssqlIntrospector;
|
|
193
|
+
//# sourceMappingURL=MssqlIntrospector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MssqlIntrospector.js","sourceRoot":"","sources":["../../src/introspection/MssqlIntrospector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseIntrospector } from './Introspector';
|
|
2
|
+
import { DatabaseSchema } from '../types/introspection';
|
|
3
|
+
export declare class MysqlIntrospector extends BaseIntrospector {
|
|
4
|
+
introspectSchema(): Promise<DatabaseSchema>;
|
|
5
|
+
private loadTables;
|
|
6
|
+
private loadColumns;
|
|
7
|
+
private loadIndexes;
|
|
8
|
+
private loadForeignKeys;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=MysqlIntrospector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MysqlIntrospector.d.ts","sourceRoot":"","sources":["../../src/introspection/MysqlIntrospector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAEL,cAAc,EAIf,MAAM,wBAAwB,CAAC;AAoChC,qBAAa,iBAAkB,SAAQ,gBAAgB;IAC/C,gBAAgB,IAAI,OAAO,CAAC,cAAc,CAAC;YAwHnC,UAAU;YAYV,WAAW;YAoBX,WAAW;YAgBX,eAAe;CAoB9B"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MysqlIntrospector = void 0;
|
|
4
|
+
const Introspector_1 = require("./Introspector");
|
|
5
|
+
class MysqlIntrospector extends Introspector_1.BaseIntrospector {
|
|
6
|
+
async introspectSchema() {
|
|
7
|
+
const tables = await this.loadTables();
|
|
8
|
+
const columns = await this.loadColumns();
|
|
9
|
+
const indexes = await this.loadIndexes();
|
|
10
|
+
const foreignKeys = await this.loadForeignKeys();
|
|
11
|
+
const tableMap = new Map();
|
|
12
|
+
tables.forEach((t) => {
|
|
13
|
+
tableMap.set(t.table_name, {
|
|
14
|
+
name: t.table_name,
|
|
15
|
+
columns: [],
|
|
16
|
+
indexes: [],
|
|
17
|
+
foreignKeys: [],
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
const pkColumnsByTable = new Map();
|
|
21
|
+
const uniqueColumnsByTable = new Map();
|
|
22
|
+
indexes
|
|
23
|
+
.filter((i) => i.index_name === 'PRIMARY')
|
|
24
|
+
.forEach((i) => {
|
|
25
|
+
if (!pkColumnsByTable.has(i.table_name)) {
|
|
26
|
+
pkColumnsByTable.set(i.table_name, new Set());
|
|
27
|
+
}
|
|
28
|
+
pkColumnsByTable.get(i.table_name)?.add(i.column_name);
|
|
29
|
+
});
|
|
30
|
+
indexes
|
|
31
|
+
.filter((i) => i.index_name !== 'PRIMARY' && i.non_unique === 0)
|
|
32
|
+
.forEach((i) => {
|
|
33
|
+
if (!uniqueColumnsByTable.has(i.table_name)) {
|
|
34
|
+
uniqueColumnsByTable.set(i.table_name, new Set());
|
|
35
|
+
}
|
|
36
|
+
uniqueColumnsByTable.get(i.table_name)?.add(i.column_name);
|
|
37
|
+
});
|
|
38
|
+
columns.forEach((c) => {
|
|
39
|
+
const table = tableMap.get(c.table_name);
|
|
40
|
+
if (!table)
|
|
41
|
+
return;
|
|
42
|
+
const pkSet = pkColumnsByTable.get(c.table_name);
|
|
43
|
+
const uniqueSet = uniqueColumnsByTable.get(c.table_name);
|
|
44
|
+
const column = {
|
|
45
|
+
name: c.column_name,
|
|
46
|
+
dataType: c.data_type,
|
|
47
|
+
isNullable: c.is_nullable === 'YES',
|
|
48
|
+
hasDefault: c.column_default !== null,
|
|
49
|
+
defaultValue: c.column_default,
|
|
50
|
+
isPrimaryKey: pkSet ? pkSet.has(c.column_name) : false,
|
|
51
|
+
isUnique: uniqueSet ? uniqueSet.has(c.column_name) : false,
|
|
52
|
+
isAutoIncrement: c.extra.toLowerCase().includes('auto_increment'),
|
|
53
|
+
maxLength: c.character_maximum_length,
|
|
54
|
+
numericPrecision: c.numeric_precision,
|
|
55
|
+
numericScale: c.numeric_scale,
|
|
56
|
+
};
|
|
57
|
+
table.columns.push(column);
|
|
58
|
+
});
|
|
59
|
+
const indexMap = new Map();
|
|
60
|
+
indexes.forEach((i) => {
|
|
61
|
+
const key = `${i.table_name}:${i.index_name}`;
|
|
62
|
+
if (!indexMap.has(key)) {
|
|
63
|
+
indexMap.set(key, {
|
|
64
|
+
name: i.index_name,
|
|
65
|
+
columns: [],
|
|
66
|
+
isUnique: i.non_unique === 0,
|
|
67
|
+
isPrimary: i.index_name === 'PRIMARY',
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
const entry = indexMap.get(key);
|
|
71
|
+
if (!entry)
|
|
72
|
+
return;
|
|
73
|
+
entry.columns.push(i.column_name);
|
|
74
|
+
});
|
|
75
|
+
indexMap.forEach((idx, key) => {
|
|
76
|
+
const tableName = key.split(':')[0];
|
|
77
|
+
const table = tableMap.get(tableName);
|
|
78
|
+
if (!table)
|
|
79
|
+
return;
|
|
80
|
+
table.indexes.push(idx);
|
|
81
|
+
});
|
|
82
|
+
const fkMap = new Map();
|
|
83
|
+
foreignKeys.forEach((fk) => {
|
|
84
|
+
const key = `${fk.table_name}:${fk.constraint_name}`;
|
|
85
|
+
if (!fkMap.has(key)) {
|
|
86
|
+
fkMap.set(key, {
|
|
87
|
+
name: fk.constraint_name,
|
|
88
|
+
tableName: fk.table_name,
|
|
89
|
+
columns: [],
|
|
90
|
+
referencedTable: fk.referenced_table_name,
|
|
91
|
+
referencedColumns: [],
|
|
92
|
+
updateRule: fk.update_rule,
|
|
93
|
+
deleteRule: fk.delete_rule,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
const entry = fkMap.get(key);
|
|
97
|
+
if (!entry)
|
|
98
|
+
return;
|
|
99
|
+
entry.columns.push(fk.column_name);
|
|
100
|
+
entry.referencedColumns.push(fk.referenced_column_name);
|
|
101
|
+
});
|
|
102
|
+
fkMap.forEach((fk) => {
|
|
103
|
+
const table = tableMap.get(fk.tableName);
|
|
104
|
+
if (!table)
|
|
105
|
+
return;
|
|
106
|
+
table.foreignKeys.push(fk);
|
|
107
|
+
});
|
|
108
|
+
return {
|
|
109
|
+
tables: Array.from(tableMap.values()),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
async loadTables() {
|
|
113
|
+
const sql = `
|
|
114
|
+
SELECT table_name
|
|
115
|
+
FROM information_schema.tables
|
|
116
|
+
WHERE table_schema = DATABASE()
|
|
117
|
+
AND table_type = 'BASE TABLE'
|
|
118
|
+
ORDER BY table_name
|
|
119
|
+
`;
|
|
120
|
+
return this.connector.query(sql);
|
|
121
|
+
}
|
|
122
|
+
async loadColumns() {
|
|
123
|
+
const sql = `
|
|
124
|
+
SELECT
|
|
125
|
+
table_name,
|
|
126
|
+
column_name,
|
|
127
|
+
data_type,
|
|
128
|
+
is_nullable,
|
|
129
|
+
column_default,
|
|
130
|
+
character_maximum_length,
|
|
131
|
+
numeric_precision,
|
|
132
|
+
numeric_scale,
|
|
133
|
+
extra
|
|
134
|
+
FROM information_schema.columns
|
|
135
|
+
WHERE table_schema = DATABASE()
|
|
136
|
+
ORDER BY table_name, ordinal_position
|
|
137
|
+
`;
|
|
138
|
+
return this.connector.query(sql);
|
|
139
|
+
}
|
|
140
|
+
async loadIndexes() {
|
|
141
|
+
const sql = `
|
|
142
|
+
SELECT
|
|
143
|
+
table_name,
|
|
144
|
+
index_name,
|
|
145
|
+
non_unique,
|
|
146
|
+
column_name,
|
|
147
|
+
seq_in_index
|
|
148
|
+
FROM information_schema.statistics
|
|
149
|
+
WHERE table_schema = DATABASE()
|
|
150
|
+
ORDER BY table_name, index_name, seq_in_index
|
|
151
|
+
`;
|
|
152
|
+
return this.connector.query(sql);
|
|
153
|
+
}
|
|
154
|
+
async loadForeignKeys() {
|
|
155
|
+
const sql = `
|
|
156
|
+
SELECT
|
|
157
|
+
rc.constraint_name,
|
|
158
|
+
kcu.table_name,
|
|
159
|
+
kcu.column_name,
|
|
160
|
+
kcu.referenced_table_name,
|
|
161
|
+
kcu.referenced_column_name,
|
|
162
|
+
rc.update_rule,
|
|
163
|
+
rc.delete_rule
|
|
164
|
+
FROM information_schema.referential_constraints AS rc
|
|
165
|
+
JOIN information_schema.key_column_usage AS kcu
|
|
166
|
+
ON rc.constraint_name = kcu.constraint_name
|
|
167
|
+
AND rc.constraint_schema = kcu.table_schema
|
|
168
|
+
WHERE kcu.table_schema = DATABASE()
|
|
169
|
+
ORDER BY kcu.table_name, rc.constraint_name, kcu.ordinal_position
|
|
170
|
+
`;
|
|
171
|
+
return this.connector.query(sql);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
exports.MysqlIntrospector = MysqlIntrospector;
|
|
175
|
+
//# sourceMappingURL=MysqlIntrospector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MysqlIntrospector.js","sourceRoot":"","sources":["../../src/introspection/MysqlIntrospector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DatabaseSchema } from '../types/introspection';
|
|
2
|
+
import { BaseIntrospector } from './Introspector';
|
|
3
|
+
export declare class PostgresIntrospector extends BaseIntrospector {
|
|
4
|
+
introspectSchema(): Promise<DatabaseSchema>;
|
|
5
|
+
private loadTables;
|
|
6
|
+
private loadColumns;
|
|
7
|
+
private loadConstraints;
|
|
8
|
+
private loadIndexes;
|
|
9
|
+
private loadForeignKeys;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=PostgresIntrospector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PostgresIntrospector.d.ts","sourceRoot":"","sources":["../../src/introspection/PostgresIntrospector.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAIf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AA0ClD,qBAAa,oBAAqB,SAAQ,gBAAgB;IAClD,gBAAgB,IAAI,OAAO,CAAC,cAAc,CAAC;YA2GnC,UAAU;YAYV,WAAW;YAmBX,eAAe;YAmBf,WAAW;YAsBX,eAAe;CA2B9B"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PostgresIntrospector = void 0;
|
|
4
|
+
const Introspector_1 = require("./Introspector");
|
|
5
|
+
class PostgresIntrospector extends Introspector_1.BaseIntrospector {
|
|
6
|
+
async introspectSchema() {
|
|
7
|
+
const tables = await this.loadTables();
|
|
8
|
+
const columns = await this.loadColumns();
|
|
9
|
+
const constraints = await this.loadConstraints();
|
|
10
|
+
const indexes = await this.loadIndexes();
|
|
11
|
+
const foreignKeys = await this.loadForeignKeys();
|
|
12
|
+
const tableMap = new Map();
|
|
13
|
+
tables.forEach((t) => {
|
|
14
|
+
tableMap.set(t.table_name, {
|
|
15
|
+
name: t.table_name,
|
|
16
|
+
columns: [],
|
|
17
|
+
indexes: [],
|
|
18
|
+
foreignKeys: [],
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
const pkColumnsByTable = new Map();
|
|
22
|
+
const uniqueColumnsByTable = new Map();
|
|
23
|
+
constraints.forEach((c) => {
|
|
24
|
+
if (c.constraint_type === 'PRIMARY KEY') {
|
|
25
|
+
if (!pkColumnsByTable.has(c.table_name)) {
|
|
26
|
+
pkColumnsByTable.set(c.table_name, new Set());
|
|
27
|
+
}
|
|
28
|
+
pkColumnsByTable.get(c.table_name)?.add(c.column_name);
|
|
29
|
+
}
|
|
30
|
+
if (c.constraint_type === 'UNIQUE') {
|
|
31
|
+
if (!uniqueColumnsByTable.has(c.table_name)) {
|
|
32
|
+
uniqueColumnsByTable.set(c.table_name, new Set());
|
|
33
|
+
}
|
|
34
|
+
uniqueColumnsByTable.get(c.table_name)?.add(c.column_name);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
columns.forEach((c) => {
|
|
38
|
+
const table = tableMap.get(c.table_name);
|
|
39
|
+
if (!table)
|
|
40
|
+
return;
|
|
41
|
+
const pkSet = pkColumnsByTable.get(c.table_name);
|
|
42
|
+
const uniqueSet = uniqueColumnsByTable.get(c.table_name);
|
|
43
|
+
const column = {
|
|
44
|
+
name: c.column_name,
|
|
45
|
+
dataType: c.data_type,
|
|
46
|
+
isNullable: c.is_nullable === 'YES',
|
|
47
|
+
hasDefault: c.column_default !== null,
|
|
48
|
+
defaultValue: c.column_default,
|
|
49
|
+
isPrimaryKey: pkSet ? pkSet.has(c.column_name) : false,
|
|
50
|
+
isUnique: uniqueSet ? uniqueSet.has(c.column_name) : false,
|
|
51
|
+
isAutoIncrement: c.column_default !== null && c.column_default.includes('nextval'),
|
|
52
|
+
maxLength: c.character_maximum_length,
|
|
53
|
+
numericPrecision: c.numeric_precision,
|
|
54
|
+
numericScale: c.numeric_scale,
|
|
55
|
+
};
|
|
56
|
+
table.columns.push(column);
|
|
57
|
+
});
|
|
58
|
+
indexes.forEach((i) => {
|
|
59
|
+
const table = tableMap.get(i.table_name);
|
|
60
|
+
if (!table)
|
|
61
|
+
return;
|
|
62
|
+
const index = {
|
|
63
|
+
name: i.index_name,
|
|
64
|
+
columns: i.column_names,
|
|
65
|
+
isUnique: i.is_unique,
|
|
66
|
+
isPrimary: i.is_primary,
|
|
67
|
+
};
|
|
68
|
+
table.indexes.push(index);
|
|
69
|
+
});
|
|
70
|
+
const fkMap = new Map();
|
|
71
|
+
foreignKeys.forEach((fk) => {
|
|
72
|
+
const key = `${fk.table_name}:${fk.constraint_name}`;
|
|
73
|
+
if (!fkMap.has(key)) {
|
|
74
|
+
fkMap.set(key, {
|
|
75
|
+
name: fk.constraint_name,
|
|
76
|
+
tableName: fk.table_name,
|
|
77
|
+
columns: [],
|
|
78
|
+
referencedTable: fk.referenced_table_name,
|
|
79
|
+
referencedColumns: [],
|
|
80
|
+
updateRule: fk.update_rule,
|
|
81
|
+
deleteRule: fk.delete_rule,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
const entry = fkMap.get(key);
|
|
85
|
+
if (!entry)
|
|
86
|
+
return;
|
|
87
|
+
entry.columns.push(fk.column_name);
|
|
88
|
+
entry.referencedColumns.push(fk.referenced_column_name);
|
|
89
|
+
});
|
|
90
|
+
fkMap.forEach((fk) => {
|
|
91
|
+
const tableEntry = tableMap.get(fk.tableName);
|
|
92
|
+
if (!tableEntry)
|
|
93
|
+
return;
|
|
94
|
+
tableEntry.foreignKeys.push(fk);
|
|
95
|
+
});
|
|
96
|
+
return {
|
|
97
|
+
tables: Array.from(tableMap.values()),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
async loadTables() {
|
|
101
|
+
const sql = `
|
|
102
|
+
SELECT table_name
|
|
103
|
+
FROM information_schema.tables
|
|
104
|
+
WHERE table_schema = 'public'
|
|
105
|
+
AND table_type = 'BASE TABLE'
|
|
106
|
+
ORDER BY table_name
|
|
107
|
+
`;
|
|
108
|
+
return this.connector.query(sql);
|
|
109
|
+
}
|
|
110
|
+
async loadColumns() {
|
|
111
|
+
const sql = `
|
|
112
|
+
SELECT
|
|
113
|
+
table_name,
|
|
114
|
+
column_name,
|
|
115
|
+
data_type,
|
|
116
|
+
is_nullable,
|
|
117
|
+
column_default,
|
|
118
|
+
character_maximum_length,
|
|
119
|
+
numeric_precision,
|
|
120
|
+
numeric_scale
|
|
121
|
+
FROM information_schema.columns
|
|
122
|
+
WHERE table_schema = 'public'
|
|
123
|
+
ORDER BY table_name, ordinal_position
|
|
124
|
+
`;
|
|
125
|
+
return this.connector.query(sql);
|
|
126
|
+
}
|
|
127
|
+
async loadConstraints() {
|
|
128
|
+
const sql = `
|
|
129
|
+
SELECT
|
|
130
|
+
tc.table_name,
|
|
131
|
+
tc.constraint_name,
|
|
132
|
+
tc.constraint_type,
|
|
133
|
+
kcu.column_name
|
|
134
|
+
FROM information_schema.table_constraints AS tc
|
|
135
|
+
JOIN information_schema.key_column_usage AS kcu
|
|
136
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
137
|
+
AND tc.table_schema = kcu.table_schema
|
|
138
|
+
WHERE tc.table_schema = 'public'
|
|
139
|
+
AND tc.constraint_type IN ('PRIMARY KEY', 'UNIQUE')
|
|
140
|
+
ORDER BY tc.table_name, tc.constraint_name, kcu.ordinal_position
|
|
141
|
+
`;
|
|
142
|
+
return this.connector.query(sql);
|
|
143
|
+
}
|
|
144
|
+
async loadIndexes() {
|
|
145
|
+
const sql = `
|
|
146
|
+
SELECT
|
|
147
|
+
t.relname AS table_name,
|
|
148
|
+
i.relname AS index_name,
|
|
149
|
+
ix.indisunique AS is_unique,
|
|
150
|
+
ix.indisprimary AS is_primary,
|
|
151
|
+
ARRAY_AGG(a.attname ORDER BY array_position(ix.indkey, a.attnum::smallint)) AS column_names
|
|
152
|
+
FROM pg_class t
|
|
153
|
+
JOIN pg_index ix ON t.oid = ix.indrelid
|
|
154
|
+
JOIN pg_class i ON i.oid = ix.indexrelid
|
|
155
|
+
JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey)
|
|
156
|
+
JOIN pg_namespace ns ON ns.oid = t.relnamespace
|
|
157
|
+
WHERE ns.nspname = 'public'
|
|
158
|
+
AND t.relkind = 'r'
|
|
159
|
+
GROUP BY t.relname, i.relname, ix.indisunique, ix.indisprimary
|
|
160
|
+
ORDER BY t.relname, i.relname
|
|
161
|
+
`;
|
|
162
|
+
return this.connector.query(sql);
|
|
163
|
+
}
|
|
164
|
+
async loadForeignKeys() {
|
|
165
|
+
const sql = `
|
|
166
|
+
SELECT
|
|
167
|
+
tc.constraint_name,
|
|
168
|
+
tc.table_name,
|
|
169
|
+
kcu.column_name,
|
|
170
|
+
ccu.table_name AS referenced_table_name,
|
|
171
|
+
ccu.column_name AS referenced_column_name,
|
|
172
|
+
rc.update_rule,
|
|
173
|
+
rc.delete_rule
|
|
174
|
+
FROM information_schema.table_constraints AS tc
|
|
175
|
+
JOIN information_schema.key_column_usage AS kcu
|
|
176
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
177
|
+
AND tc.table_schema = kcu.table_schema
|
|
178
|
+
JOIN information_schema.constraint_column_usage AS ccu
|
|
179
|
+
ON ccu.constraint_name = tc.constraint_name
|
|
180
|
+
AND ccu.table_schema = tc.table_schema
|
|
181
|
+
JOIN information_schema.referential_constraints AS rc
|
|
182
|
+
ON rc.constraint_name = tc.constraint_name
|
|
183
|
+
AND rc.constraint_schema = tc.table_schema
|
|
184
|
+
WHERE tc.constraint_type = 'FOREIGN KEY'
|
|
185
|
+
AND tc.table_schema = 'public'
|
|
186
|
+
ORDER BY tc.table_name, tc.constraint_name, kcu.ordinal_position
|
|
187
|
+
`;
|
|
188
|
+
return this.connector.query(sql);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
exports.PostgresIntrospector = PostgresIntrospector;
|
|
192
|
+
//# sourceMappingURL=PostgresIntrospector.js.map
|