@uql/core 3.8.2 → 3.8.5
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/CHANGELOG.md +13 -1
- package/README.md +1 -0
- package/dist/migrate/builder/migrationBuilder.d.ts.map +1 -1
- package/dist/migrate/builder/migrationBuilder.js +7 -1
- package/dist/migrate/builder/migrationBuilder.js.map +1 -1
- package/dist/migrate/codegen/entityCodeGenerator.d.ts.map +1 -1
- package/dist/migrate/codegen/entityCodeGenerator.js +12 -8
- package/dist/migrate/codegen/entityCodeGenerator.js.map +1 -1
- package/dist/migrate/introspection/abstractSqlSchemaIntrospector.d.ts +77 -0
- package/dist/migrate/introspection/abstractSqlSchemaIntrospector.d.ts.map +1 -0
- package/dist/migrate/introspection/abstractSqlSchemaIntrospector.js +156 -0
- package/dist/migrate/introspection/abstractSqlSchemaIntrospector.js.map +1 -0
- package/dist/migrate/introspection/index.d.ts +1 -0
- package/dist/migrate/introspection/index.d.ts.map +1 -1
- package/dist/migrate/introspection/index.js +1 -0
- package/dist/migrate/introspection/index.js.map +1 -1
- package/dist/migrate/introspection/mysqlIntrospector.d.ts +16 -15
- package/dist/migrate/introspection/mysqlIntrospector.d.ts.map +1 -1
- package/dist/migrate/introspection/mysqlIntrospector.js +64 -122
- package/dist/migrate/introspection/mysqlIntrospector.js.map +1 -1
- package/dist/migrate/introspection/postgresIntrospector.d.ts +16 -14
- package/dist/migrate/introspection/postgresIntrospector.d.ts.map +1 -1
- package/dist/migrate/introspection/postgresIntrospector.js +68 -117
- package/dist/migrate/introspection/postgresIntrospector.js.map +1 -1
- package/dist/migrate/introspection/sqliteIntrospector.d.ts +20 -14
- package/dist/migrate/introspection/sqliteIntrospector.d.ts.map +1 -1
- package/dist/migrate/introspection/sqliteIntrospector.js +78 -116
- package/dist/migrate/introspection/sqliteIntrospector.js.map +1 -1
- package/dist/migrate/schemaGenerator.d.ts +1 -13
- package/dist/migrate/schemaGenerator.d.ts.map +1 -1
- package/dist/migrate/schemaGenerator.js +9 -72
- package/dist/migrate/schemaGenerator.js.map +1 -1
- package/dist/schema/schemaASTBuilder.d.ts.map +1 -1
- package/dist/schema/schemaASTBuilder.js +31 -0
- package/dist/schema/schemaASTBuilder.js.map +1 -1
- package/package.json +2 -3
|
@@ -1,86 +1,39 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BaseSqlIntrospector } from './baseSqlIntrospector.js';
|
|
1
|
+
import { AbstractSqlSchemaIntrospector } from './abstractSqlSchemaIntrospector.js';
|
|
3
2
|
/**
|
|
4
3
|
* MySQL/MariaDB schema introspector.
|
|
5
4
|
* Works with both MySQL and MariaDB as they share the same information_schema structure.
|
|
6
5
|
*/
|
|
7
|
-
export class MysqlSchemaIntrospector extends
|
|
6
|
+
export class MysqlSchemaIntrospector extends AbstractSqlSchemaIntrospector {
|
|
8
7
|
pool;
|
|
9
8
|
constructor(pool) {
|
|
10
9
|
super('mysql');
|
|
11
10
|
this.pool = pool;
|
|
12
11
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
this.getPrimaryKey(querier, tableName),
|
|
25
|
-
]);
|
|
26
|
-
return {
|
|
27
|
-
name: tableName,
|
|
28
|
-
columns,
|
|
29
|
-
primaryKey,
|
|
30
|
-
indexes,
|
|
31
|
-
foreignKeys,
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
finally {
|
|
35
|
-
await querier.release();
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
async getTableNames() {
|
|
39
|
-
const querier = await this.getQuerier();
|
|
40
|
-
try {
|
|
41
|
-
const sql = `
|
|
42
|
-
SELECT TABLE_NAME as table_name
|
|
43
|
-
FROM information_schema.TABLES
|
|
44
|
-
WHERE TABLE_SCHEMA = DATABASE()
|
|
45
|
-
AND TABLE_TYPE = 'BASE TABLE'
|
|
46
|
-
ORDER BY TABLE_NAME
|
|
47
|
-
`;
|
|
48
|
-
const results = await querier.all(sql);
|
|
49
|
-
return results.map((r) => r.table_name);
|
|
50
|
-
}
|
|
51
|
-
finally {
|
|
52
|
-
await querier.release();
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
async tableExists(tableName) {
|
|
56
|
-
const querier = await this.getQuerier();
|
|
57
|
-
try {
|
|
58
|
-
return this.tableExistsInternal(querier, tableName);
|
|
59
|
-
}
|
|
60
|
-
finally {
|
|
61
|
-
await querier.release();
|
|
62
|
-
}
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// SQL Queries (dialect-specific)
|
|
14
|
+
// ============================================================================
|
|
15
|
+
getTableNamesQuery() {
|
|
16
|
+
return /*sql*/ `
|
|
17
|
+
SELECT TABLE_NAME as table_name
|
|
18
|
+
FROM information_schema.TABLES
|
|
19
|
+
WHERE TABLE_SCHEMA = DATABASE()
|
|
20
|
+
AND TABLE_TYPE = 'BASE TABLE'
|
|
21
|
+
ORDER BY TABLE_NAME
|
|
22
|
+
`;
|
|
63
23
|
}
|
|
64
|
-
|
|
65
|
-
|
|
24
|
+
tableExistsQuery() {
|
|
25
|
+
return /*sql*/ `
|
|
66
26
|
SELECT COUNT(*) as count
|
|
67
27
|
FROM information_schema.TABLES
|
|
68
28
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
69
29
|
AND TABLE_NAME = ?
|
|
70
30
|
`;
|
|
71
|
-
const results = await querier.all(sql, [tableName]);
|
|
72
|
-
return (results[0]?.count ?? 0) > 0;
|
|
73
31
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if (!isSqlQuerier(querier)) {
|
|
77
|
-
await querier.release();
|
|
78
|
-
throw new Error('MysqlSchemaIntrospector requires a SQL-based querier');
|
|
79
|
-
}
|
|
80
|
-
return querier;
|
|
32
|
+
parseTableExistsResult(results) {
|
|
33
|
+
return this.toNumber(results[0]?.count) > 0;
|
|
81
34
|
}
|
|
82
|
-
|
|
83
|
-
|
|
35
|
+
getColumnsQuery(_tableName) {
|
|
36
|
+
return /*sql*/ `
|
|
84
37
|
SELECT
|
|
85
38
|
COLUMN_NAME as column_name,
|
|
86
39
|
DATA_TYPE as data_type,
|
|
@@ -98,29 +51,9 @@ export class MysqlSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
98
51
|
AND TABLE_NAME = ?
|
|
99
52
|
ORDER BY ORDINAL_POSITION
|
|
100
53
|
`;
|
|
101
|
-
const results = await querier.all(sql, [tableName]);
|
|
102
|
-
return results.map((row) => ({
|
|
103
|
-
name: row.column_name,
|
|
104
|
-
type: (row.column_type || '').toUpperCase(),
|
|
105
|
-
nullable: row.is_nullable === 'YES',
|
|
106
|
-
defaultValue: this.parseDefaultValue(row.column_default),
|
|
107
|
-
isPrimaryKey: row.column_key === 'PRI',
|
|
108
|
-
isAutoIncrement: (row.extra || '').toLowerCase().includes('auto_increment'),
|
|
109
|
-
isUnique: row.column_key === 'UNI',
|
|
110
|
-
length: this.toNumber(row.character_maximum_length),
|
|
111
|
-
precision: this.toNumber(row.numeric_precision),
|
|
112
|
-
scale: this.toNumber(row.numeric_scale),
|
|
113
|
-
comment: row.column_comment || undefined,
|
|
114
|
-
}));
|
|
115
|
-
}
|
|
116
|
-
toNumber(value) {
|
|
117
|
-
if (value == null) {
|
|
118
|
-
return undefined;
|
|
119
|
-
}
|
|
120
|
-
return Number(value);
|
|
121
54
|
}
|
|
122
|
-
|
|
123
|
-
|
|
55
|
+
getIndexesQuery(_tableName) {
|
|
56
|
+
return /*sql*/ `
|
|
124
57
|
SELECT
|
|
125
58
|
INDEX_NAME as index_name,
|
|
126
59
|
GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) as columns,
|
|
@@ -132,15 +65,9 @@ export class MysqlSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
132
65
|
GROUP BY INDEX_NAME, NON_UNIQUE
|
|
133
66
|
ORDER BY INDEX_NAME
|
|
134
67
|
`;
|
|
135
|
-
const results = await querier.all(sql, [tableName]);
|
|
136
|
-
return results.map((row) => ({
|
|
137
|
-
name: row.index_name,
|
|
138
|
-
columns: (row.columns || '').split(','),
|
|
139
|
-
unique: Boolean(row.is_unique),
|
|
140
|
-
}));
|
|
141
68
|
}
|
|
142
|
-
|
|
143
|
-
|
|
69
|
+
getForeignKeysQuery(_tableName) {
|
|
70
|
+
return /*sql*/ `
|
|
144
71
|
SELECT
|
|
145
72
|
kcu.CONSTRAINT_NAME as constraint_name,
|
|
146
73
|
GROUP_CONCAT(kcu.COLUMN_NAME ORDER BY kcu.ORDINAL_POSITION) as columns,
|
|
@@ -158,7 +85,46 @@ export class MysqlSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
158
85
|
GROUP BY kcu.CONSTRAINT_NAME, kcu.REFERENCED_TABLE_NAME, rc.DELETE_RULE, rc.UPDATE_RULE
|
|
159
86
|
ORDER BY kcu.CONSTRAINT_NAME
|
|
160
87
|
`;
|
|
161
|
-
|
|
88
|
+
}
|
|
89
|
+
getPrimaryKeyQuery(_tableName) {
|
|
90
|
+
return /*sql*/ `
|
|
91
|
+
SELECT COLUMN_NAME as column_name
|
|
92
|
+
FROM information_schema.KEY_COLUMN_USAGE
|
|
93
|
+
WHERE TABLE_SCHEMA = DATABASE()
|
|
94
|
+
AND TABLE_NAME = ?
|
|
95
|
+
AND CONSTRAINT_NAME = 'PRIMARY'
|
|
96
|
+
ORDER BY ORDINAL_POSITION
|
|
97
|
+
`;
|
|
98
|
+
}
|
|
99
|
+
// ============================================================================
|
|
100
|
+
// Row Mapping (dialect-specific)
|
|
101
|
+
// ============================================================================
|
|
102
|
+
mapTableNameRow(row) {
|
|
103
|
+
return row.table_name;
|
|
104
|
+
}
|
|
105
|
+
async mapColumnsResult(_querier, _tableName, results) {
|
|
106
|
+
return results.map((row) => ({
|
|
107
|
+
name: row.column_name,
|
|
108
|
+
type: (row.column_type || '').toUpperCase(),
|
|
109
|
+
nullable: row.is_nullable === 'YES',
|
|
110
|
+
defaultValue: this.parseDefaultValue(row.column_default),
|
|
111
|
+
isPrimaryKey: row.column_key === 'PRI',
|
|
112
|
+
isAutoIncrement: (row.extra || '').toLowerCase().includes('auto_increment'),
|
|
113
|
+
isUnique: row.column_key === 'UNI',
|
|
114
|
+
length: this.toNumber(row.character_maximum_length),
|
|
115
|
+
precision: this.toNumber(row.numeric_precision),
|
|
116
|
+
scale: this.toNumber(row.numeric_scale),
|
|
117
|
+
comment: row.column_comment || undefined,
|
|
118
|
+
}));
|
|
119
|
+
}
|
|
120
|
+
async mapIndexesResult(_querier, _tableName, results) {
|
|
121
|
+
return results.map((row) => ({
|
|
122
|
+
name: row.index_name,
|
|
123
|
+
columns: (row.columns || '').split(','),
|
|
124
|
+
unique: Boolean(row.is_unique),
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
async mapForeignKeysResult(_querier, _tableName, results) {
|
|
162
128
|
return results.map((row) => ({
|
|
163
129
|
name: row.constraint_name,
|
|
164
130
|
columns: (row.columns || '').split(','),
|
|
@@ -168,16 +134,7 @@ export class MysqlSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
168
134
|
onUpdate: this.normalizeReferentialAction(row.update_rule),
|
|
169
135
|
}));
|
|
170
136
|
}
|
|
171
|
-
|
|
172
|
-
const sql = `
|
|
173
|
-
SELECT COLUMN_NAME as column_name
|
|
174
|
-
FROM information_schema.KEY_COLUMN_USAGE
|
|
175
|
-
WHERE TABLE_SCHEMA = DATABASE()
|
|
176
|
-
AND TABLE_NAME = ?
|
|
177
|
-
AND CONSTRAINT_NAME = 'PRIMARY'
|
|
178
|
-
ORDER BY ORDINAL_POSITION
|
|
179
|
-
`;
|
|
180
|
-
const results = await querier.all(sql, [tableName]);
|
|
137
|
+
mapPrimaryKeyResult(results) {
|
|
181
138
|
if (results.length === 0) {
|
|
182
139
|
return undefined;
|
|
183
140
|
}
|
|
@@ -187,7 +144,6 @@ export class MysqlSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
187
144
|
if (defaultValue === null) {
|
|
188
145
|
return undefined;
|
|
189
146
|
}
|
|
190
|
-
// Check for common patterns
|
|
191
147
|
if (defaultValue === 'NULL') {
|
|
192
148
|
return null;
|
|
193
149
|
}
|
|
@@ -206,20 +162,6 @@ export class MysqlSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
206
162
|
}
|
|
207
163
|
return defaultValue;
|
|
208
164
|
}
|
|
209
|
-
normalizeReferentialAction(action) {
|
|
210
|
-
switch (action.toUpperCase()) {
|
|
211
|
-
case 'CASCADE':
|
|
212
|
-
return 'CASCADE';
|
|
213
|
-
case 'SET NULL':
|
|
214
|
-
return 'SET NULL';
|
|
215
|
-
case 'RESTRICT':
|
|
216
|
-
return 'RESTRICT';
|
|
217
|
-
case 'NO ACTION':
|
|
218
|
-
return 'NO ACTION';
|
|
219
|
-
default:
|
|
220
|
-
return undefined;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
165
|
}
|
|
224
166
|
/**
|
|
225
167
|
* Alias for MysqlSchemaIntrospector.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysqlIntrospector.js","sourceRoot":"","sources":["../../../src/migrate/introspection/mysqlIntrospector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mysqlIntrospector.js","sourceRoot":"","sources":["../../../src/migrate/introspection/mysqlIntrospector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,25 @@
|
|
|
1
|
-
import type { ColumnSchema, ForeignKeySchema, IndexSchema, QuerierPool,
|
|
2
|
-
import {
|
|
1
|
+
import type { ColumnSchema, ForeignKeySchema, IndexSchema, QuerierPool, SqlQuerier } from '../../type/index.js';
|
|
2
|
+
import { AbstractSqlSchemaIntrospector } from './abstractSqlSchemaIntrospector.js';
|
|
3
3
|
/**
|
|
4
4
|
* PostgreSQL schema introspector
|
|
5
5
|
*/
|
|
6
|
-
export declare class PostgresSchemaIntrospector extends
|
|
7
|
-
|
|
6
|
+
export declare class PostgresSchemaIntrospector extends AbstractSqlSchemaIntrospector {
|
|
7
|
+
protected readonly pool: QuerierPool;
|
|
8
8
|
constructor(pool: QuerierPool);
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
protected
|
|
13
|
-
protected
|
|
14
|
-
protected
|
|
15
|
-
protected
|
|
16
|
-
protected
|
|
17
|
-
protected
|
|
9
|
+
protected getTableNamesQuery(): string;
|
|
10
|
+
protected tableExistsQuery(): string;
|
|
11
|
+
protected parseTableExistsResult(results: Record<string, unknown>[]): boolean;
|
|
12
|
+
protected getColumnsQuery(_tableName: string): string;
|
|
13
|
+
protected getIndexesQuery(_tableName: string): string;
|
|
14
|
+
protected getForeignKeysQuery(_tableName: string): string;
|
|
15
|
+
protected getPrimaryKeyQuery(_tableName: string): string;
|
|
16
|
+
protected mapTableNameRow(row: Record<string, unknown>): string;
|
|
17
|
+
protected mapColumnsResult(_querier: SqlQuerier, _tableName: string, results: Record<string, unknown>[]): Promise<ColumnSchema[]>;
|
|
18
|
+
protected mapIndexesResult(_querier: SqlQuerier, _tableName: string, results: Record<string, unknown>[]): Promise<IndexSchema[]>;
|
|
19
|
+
protected mapForeignKeysResult(_querier: SqlQuerier, _tableName: string, results: Record<string, unknown>[]): Promise<ForeignKeySchema[]>;
|
|
20
|
+
protected mapPrimaryKeyResult(results: Record<string, unknown>[]): string[] | undefined;
|
|
18
21
|
protected normalizeType(dataType: string, udtName: string): string;
|
|
19
22
|
protected parseDefaultValue(defaultValue: string | null): unknown;
|
|
20
23
|
protected isAutoIncrement(defaultValue: string | null, isIdentity: string): boolean;
|
|
21
|
-
protected normalizeReferentialAction(action: string): 'CASCADE' | 'SET NULL' | 'RESTRICT' | 'NO ACTION' | undefined;
|
|
22
24
|
}
|
|
23
25
|
//# sourceMappingURL=postgresIntrospector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresIntrospector.d.ts","sourceRoot":"","sources":["../../../src/migrate/introspection/postgresIntrospector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"postgresIntrospector.d.ts","sourceRoot":"","sources":["../../../src/migrate/introspection/postgresIntrospector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChH,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF;;GAEG;AACH,qBAAa,0BAA2B,SAAQ,6BAA6B;IAC3E,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;gBAEzB,IAAI,EAAE,WAAW;IAS7B,SAAS,CAAC,kBAAkB,IAAI,MAAM;IAUtC,SAAS,CAAC,gBAAgB,IAAI,MAAM;IAUpC,SAAS,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,OAAO;IAI7E,SAAS,CAAC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IA4CrD,SAAS,CAAC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAoBrD,SAAS,CAAC,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IA2BzD,SAAS,CAAC,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAkBxD,SAAS,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;cAI/C,gBAAgB,CAC9B,QAAQ,EAAE,UAAU,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACjC,OAAO,CAAC,YAAY,EAAE,CAAC;cAgBV,gBAAgB,CAC9B,QAAQ,EAAE,UAAU,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACjC,OAAO,CAAC,WAAW,EAAE,CAAC;cAQT,oBAAoB,CAClC,QAAQ,EAAE,UAAU,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACjC,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAW9B,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS;IAWvF,SAAS,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IAWlE,SAAS,CAAC,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IA4BjE,SAAS,CAAC,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;CAWpF"}
|
|
@@ -1,86 +1,39 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BaseSqlIntrospector } from './baseSqlIntrospector.js';
|
|
1
|
+
import { AbstractSqlSchemaIntrospector } from './abstractSqlSchemaIntrospector.js';
|
|
3
2
|
/**
|
|
4
3
|
* PostgreSQL schema introspector
|
|
5
4
|
*/
|
|
6
|
-
export class PostgresSchemaIntrospector extends
|
|
5
|
+
export class PostgresSchemaIntrospector extends AbstractSqlSchemaIntrospector {
|
|
7
6
|
pool;
|
|
8
7
|
constructor(pool) {
|
|
9
8
|
super('postgres');
|
|
10
9
|
this.pool = pool;
|
|
11
10
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
this.getPrimaryKey(querier, tableName),
|
|
24
|
-
]);
|
|
25
|
-
return {
|
|
26
|
-
name: tableName,
|
|
27
|
-
columns,
|
|
28
|
-
primaryKey,
|
|
29
|
-
indexes,
|
|
30
|
-
foreignKeys,
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
finally {
|
|
34
|
-
await querier.release();
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
async getTableNames() {
|
|
38
|
-
const querier = await this.getQuerier();
|
|
39
|
-
try {
|
|
40
|
-
const sql = `
|
|
41
|
-
SELECT table_name
|
|
42
|
-
FROM information_schema.tables
|
|
43
|
-
WHERE table_schema = 'public'
|
|
44
|
-
AND table_type = 'BASE TABLE'
|
|
45
|
-
ORDER BY table_name
|
|
46
|
-
`;
|
|
47
|
-
const results = await querier.all(sql);
|
|
48
|
-
return results.map((r) => r.table_name);
|
|
49
|
-
}
|
|
50
|
-
finally {
|
|
51
|
-
await querier.release();
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
async tableExists(tableName) {
|
|
55
|
-
const querier = await this.getQuerier();
|
|
56
|
-
try {
|
|
57
|
-
return this.tableExistsInternal(querier, tableName);
|
|
58
|
-
}
|
|
59
|
-
finally {
|
|
60
|
-
await querier.release();
|
|
61
|
-
}
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// SQL Queries (dialect-specific)
|
|
13
|
+
// ============================================================================
|
|
14
|
+
getTableNamesQuery() {
|
|
15
|
+
return /*sql*/ `
|
|
16
|
+
SELECT table_name
|
|
17
|
+
FROM information_schema.tables
|
|
18
|
+
WHERE table_schema = 'public'
|
|
19
|
+
AND table_type = 'BASE TABLE'
|
|
20
|
+
ORDER BY table_name
|
|
21
|
+
`;
|
|
62
22
|
}
|
|
63
|
-
|
|
64
|
-
|
|
23
|
+
tableExistsQuery() {
|
|
24
|
+
return /*sql*/ `
|
|
65
25
|
SELECT EXISTS (
|
|
66
26
|
SELECT FROM information_schema.tables
|
|
67
27
|
WHERE table_schema = 'public'
|
|
68
28
|
AND table_name = $1
|
|
69
29
|
) AS exists
|
|
70
30
|
`;
|
|
71
|
-
const results = await querier.all(sql, [tableName]);
|
|
72
|
-
return results[0]?.exists ?? false;
|
|
73
31
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if (!isSqlQuerier(querier)) {
|
|
77
|
-
await querier.release();
|
|
78
|
-
throw new Error('PostgresSchemaIntrospector requires a SQL-based querier');
|
|
79
|
-
}
|
|
80
|
-
return querier;
|
|
32
|
+
parseTableExistsResult(results) {
|
|
33
|
+
return results[0]?.exists ?? false;
|
|
81
34
|
}
|
|
82
|
-
|
|
83
|
-
|
|
35
|
+
getColumnsQuery(_tableName) {
|
|
36
|
+
return /*sql*/ `
|
|
84
37
|
SELECT
|
|
85
38
|
c.column_name,
|
|
86
39
|
c.data_type,
|
|
@@ -121,23 +74,9 @@ export class PostgresSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
121
74
|
AND c.table_name = $1
|
|
122
75
|
ORDER BY c.ordinal_position
|
|
123
76
|
`;
|
|
124
|
-
const results = await querier.all(sql, [tableName]);
|
|
125
|
-
return results.map((row) => ({
|
|
126
|
-
name: row.column_name,
|
|
127
|
-
type: this.normalizeType(row.data_type, row.udt_name),
|
|
128
|
-
nullable: row.is_nullable === 'YES',
|
|
129
|
-
defaultValue: this.parseDefaultValue(row.column_default),
|
|
130
|
-
isPrimaryKey: row.is_primary_key,
|
|
131
|
-
isAutoIncrement: this.isAutoIncrement(row.column_default, row.is_identity),
|
|
132
|
-
isUnique: row.is_unique,
|
|
133
|
-
length: row.character_maximum_length ?? undefined,
|
|
134
|
-
precision: row.numeric_precision ?? undefined,
|
|
135
|
-
scale: row.numeric_scale ?? undefined,
|
|
136
|
-
comment: row.column_comment ?? undefined,
|
|
137
|
-
}));
|
|
138
77
|
}
|
|
139
|
-
|
|
140
|
-
|
|
78
|
+
getIndexesQuery(_tableName) {
|
|
79
|
+
return /*sql*/ `
|
|
141
80
|
SELECT
|
|
142
81
|
i.relname AS index_name,
|
|
143
82
|
array_to_json(array_agg(a.attname ORDER BY k.n)) AS columns,
|
|
@@ -154,15 +93,9 @@ export class PostgresSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
154
93
|
GROUP BY i.relname, ix.indisunique
|
|
155
94
|
ORDER BY i.relname
|
|
156
95
|
`;
|
|
157
|
-
const results = await querier.all(sql, [tableName]);
|
|
158
|
-
return results.map((row) => ({
|
|
159
|
-
name: row.index_name,
|
|
160
|
-
columns: row.columns,
|
|
161
|
-
unique: row.is_unique,
|
|
162
|
-
}));
|
|
163
96
|
}
|
|
164
|
-
|
|
165
|
-
|
|
97
|
+
getForeignKeysQuery(_tableName) {
|
|
98
|
+
return /*sql*/ `
|
|
166
99
|
SELECT
|
|
167
100
|
tc.constraint_name,
|
|
168
101
|
array_to_json(array_agg(kcu.column_name ORDER BY kcu.ordinal_position)) AS columns,
|
|
@@ -186,18 +119,9 @@ export class PostgresSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
186
119
|
GROUP BY tc.constraint_name, ccu.table_name, rc.delete_rule, rc.update_rule
|
|
187
120
|
ORDER BY tc.constraint_name
|
|
188
121
|
`;
|
|
189
|
-
const results = await querier.all(sql, [tableName]);
|
|
190
|
-
return results.map((row) => ({
|
|
191
|
-
name: row.constraint_name,
|
|
192
|
-
columns: row.columns,
|
|
193
|
-
referencedTable: row.referenced_table,
|
|
194
|
-
referencedColumns: row.referenced_columns,
|
|
195
|
-
onDelete: this.normalizeReferentialAction(row.delete_rule),
|
|
196
|
-
onUpdate: this.normalizeReferentialAction(row.update_rule),
|
|
197
|
-
}));
|
|
198
122
|
}
|
|
199
|
-
|
|
200
|
-
|
|
123
|
+
getPrimaryKeyQuery(_tableName) {
|
|
124
|
+
return /*sql*/ `
|
|
201
125
|
SELECT kcu.column_name
|
|
202
126
|
FROM information_schema.table_constraints tc
|
|
203
127
|
JOIN information_schema.key_column_usage kcu
|
|
@@ -208,12 +132,54 @@ export class PostgresSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
208
132
|
AND tc.table_schema = 'public'
|
|
209
133
|
ORDER BY kcu.ordinal_position
|
|
210
134
|
`;
|
|
211
|
-
|
|
135
|
+
}
|
|
136
|
+
// ============================================================================
|
|
137
|
+
// Row Mapping (dialect-specific)
|
|
138
|
+
// ============================================================================
|
|
139
|
+
mapTableNameRow(row) {
|
|
140
|
+
return row.table_name;
|
|
141
|
+
}
|
|
142
|
+
async mapColumnsResult(_querier, _tableName, results) {
|
|
143
|
+
return results.map((row) => ({
|
|
144
|
+
name: row.column_name,
|
|
145
|
+
type: this.normalizeType(row.data_type, row.udt_name),
|
|
146
|
+
nullable: row.is_nullable === 'YES',
|
|
147
|
+
defaultValue: this.parseDefaultValue(row.column_default),
|
|
148
|
+
isPrimaryKey: row.is_primary_key,
|
|
149
|
+
isAutoIncrement: this.isAutoIncrement(row.column_default, row.is_identity),
|
|
150
|
+
isUnique: row.is_unique,
|
|
151
|
+
length: row.character_maximum_length ?? undefined,
|
|
152
|
+
precision: row.numeric_precision ?? undefined,
|
|
153
|
+
scale: row.numeric_scale ?? undefined,
|
|
154
|
+
comment: row.column_comment ?? undefined,
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
async mapIndexesResult(_querier, _tableName, results) {
|
|
158
|
+
return results.map((row) => ({
|
|
159
|
+
name: row.index_name,
|
|
160
|
+
columns: row.columns,
|
|
161
|
+
unique: row.is_unique,
|
|
162
|
+
}));
|
|
163
|
+
}
|
|
164
|
+
async mapForeignKeysResult(_querier, _tableName, results) {
|
|
165
|
+
return results.map((row) => ({
|
|
166
|
+
name: row.constraint_name,
|
|
167
|
+
columns: row.columns,
|
|
168
|
+
referencedTable: row.referenced_table,
|
|
169
|
+
referencedColumns: row.referenced_columns,
|
|
170
|
+
onDelete: this.normalizeReferentialAction(row.delete_rule),
|
|
171
|
+
onUpdate: this.normalizeReferentialAction(row.update_rule),
|
|
172
|
+
}));
|
|
173
|
+
}
|
|
174
|
+
mapPrimaryKeyResult(results) {
|
|
212
175
|
if (results.length === 0) {
|
|
213
176
|
return undefined;
|
|
214
177
|
}
|
|
215
178
|
return results.map((r) => r.column_name);
|
|
216
179
|
}
|
|
180
|
+
// ============================================================================
|
|
181
|
+
// PostgreSQL-specific helpers
|
|
182
|
+
// ============================================================================
|
|
217
183
|
normalizeType(dataType, udtName) {
|
|
218
184
|
// Handle user-defined types and arrays
|
|
219
185
|
if (dataType === 'USER-DEFINED') {
|
|
@@ -230,7 +196,6 @@ export class PostgresSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
230
196
|
}
|
|
231
197
|
// Remove type casting (e.g., ::text, ::character varying, ::text[])
|
|
232
198
|
const cleaned = defaultValue.replace(/::[a-z_]+(\s+[a-z_]+)?(\[\])?/gi, '').trim();
|
|
233
|
-
// Check for common patterns
|
|
234
199
|
if (cleaned.startsWith("'") && cleaned.endsWith("'")) {
|
|
235
200
|
return cleaned.slice(1, -1);
|
|
236
201
|
}
|
|
@@ -260,19 +225,5 @@ export class PostgresSchemaIntrospector extends BaseSqlIntrospector {
|
|
|
260
225
|
}
|
|
261
226
|
return false;
|
|
262
227
|
}
|
|
263
|
-
normalizeReferentialAction(action) {
|
|
264
|
-
switch (action.toUpperCase()) {
|
|
265
|
-
case 'CASCADE':
|
|
266
|
-
return 'CASCADE';
|
|
267
|
-
case 'SET NULL':
|
|
268
|
-
return 'SET NULL';
|
|
269
|
-
case 'RESTRICT':
|
|
270
|
-
return 'RESTRICT';
|
|
271
|
-
case 'NO ACTION':
|
|
272
|
-
return 'NO ACTION';
|
|
273
|
-
default:
|
|
274
|
-
return undefined;
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
228
|
}
|
|
278
229
|
//# sourceMappingURL=postgresIntrospector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresIntrospector.js","sourceRoot":"","sources":["../../../src/migrate/introspection/postgresIntrospector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"postgresIntrospector.js","sourceRoot":"","sources":["../../../src/migrate/introspection/postgresIntrospector.ts"],"names":[],"mappings":"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"}
|