@javalabs/prisma-client 1.0.18 → 1.0.20
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/.github/CODEOWNERS +1 -0
- package/README.md +269 -269
- package/dist/index.d.ts +1 -1
- package/dist/prisma.service.d.ts +1 -1
- package/dist/scripts/add-uuid-to-table.js +32 -32
- package/dist/scripts/data-migration/batch-migrator.js +12 -12
- package/dist/scripts/data-migration/data-transformer.js +14 -14
- package/dist/scripts/data-migration/dependency-resolver.js +23 -23
- package/dist/scripts/data-migration/entity-discovery.js +68 -68
- package/dist/scripts/data-migration/foreign-key-manager.js +23 -23
- package/dist/scripts/data-migration/migration-tool.js +5 -5
- package/dist/scripts/data-migration/schema-utils.js +74 -74
- package/dist/scripts/data-migration/typecast-manager.js +4 -4
- package/dist/scripts/database-initializer.js +5 -5
- package/dist/scripts/drop-database.js +5 -5
- package/dist/scripts/fix-data-types.js +53 -53
- package/dist/scripts/fix-enum-values.js +34 -34
- package/dist/scripts/fix-schema-discrepancies.js +40 -40
- package/dist/scripts/fix-table-indexes.js +81 -81
- package/dist/scripts/migrate-schema-structure.js +4 -4
- package/dist/scripts/migrate-uuid.js +19 -19
- package/dist/scripts/post-migration-validator.js +49 -49
- package/dist/scripts/pre-migration-validator.js +107 -107
- package/dist/scripts/reset-database.js +21 -21
- package/dist/scripts/retry-failed-migrations.js +28 -28
- package/dist/scripts/run-migration.js +5 -5
- package/dist/scripts/schema-sync.js +18 -18
- package/dist/scripts/sequence-sync-cli.js +55 -55
- package/dist/scripts/sequence-synchronizer.js +20 -20
- package/dist/scripts/sync-enum-types.js +30 -30
- package/dist/scripts/sync-enum-values.js +52 -52
- package/dist/scripts/truncate-database.js +10 -10
- package/dist/scripts/verify-migration-setup.js +10 -10
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/migration-config.json +63 -63
- package/migration-config.json.bk +95 -95
- package/migrations/add_reserved_amount.sql +8 -0
- package/package.json +44 -44
- package/prisma/migrations/add_uuid_to_transactions.sql +13 -13
- package/prisma/schema.prisma +601 -554
- package/src/index.ts +23 -23
- package/src/prisma-factory.service.ts +40 -40
- package/src/prisma.module.ts +9 -9
- package/src/prisma.service.ts +16 -16
- package/src/scripts/add-uuid-to-table.ts +138 -138
- package/src/scripts/create-tenant-schemas.ts +145 -145
- package/src/scripts/data-migration/batch-migrator.ts +248 -248
- package/src/scripts/data-migration/data-transformer.ts +426 -426
- package/src/scripts/data-migration/db-connector.ts +120 -120
- package/src/scripts/data-migration/dependency-resolver.ts +174 -174
- package/src/scripts/data-migration/entity-discovery.ts +196 -196
- package/src/scripts/data-migration/foreign-key-manager.ts +277 -277
- package/src/scripts/data-migration/migration-config.json +63 -63
- package/src/scripts/data-migration/migration-tool.ts +509 -509
- package/src/scripts/data-migration/schema-utils.ts +248 -248
- package/src/scripts/data-migration/tenant-migrator.ts +201 -201
- package/src/scripts/data-migration/typecast-manager.ts +193 -193
- package/src/scripts/data-migration/types.ts +113 -113
- package/src/scripts/database-initializer.ts +49 -49
- package/src/scripts/drop-database.ts +104 -104
- package/src/scripts/dump-source-db.sh +61 -61
- package/src/scripts/encrypt-user-passwords.ts +36 -36
- package/src/scripts/error-handler.ts +117 -117
- package/src/scripts/fix-data-types.ts +241 -241
- package/src/scripts/fix-enum-values.ts +357 -357
- package/src/scripts/fix-schema-discrepancies.ts +317 -317
- package/src/scripts/fix-table-indexes.ts +601 -601
- package/src/scripts/migrate-schema-structure.ts +90 -90
- package/src/scripts/migrate-uuid.ts +76 -76
- package/src/scripts/post-migration-validator.ts +526 -526
- package/src/scripts/pre-migration-validator.ts +610 -610
- package/src/scripts/reset-database.ts +263 -263
- package/src/scripts/retry-failed-migrations.ts +416 -416
- package/src/scripts/run-migration.ts +707 -707
- package/src/scripts/schema-sync.ts +128 -128
- package/src/scripts/sequence-sync-cli.ts +416 -416
- package/src/scripts/sequence-synchronizer.ts +127 -127
- package/src/scripts/sync-enum-types.ts +170 -170
- package/src/scripts/sync-enum-values.ts +563 -563
- package/src/scripts/truncate-database.ts +123 -123
- package/src/scripts/verify-migration-setup.ts +135 -135
- package/tsconfig.json +17 -17
- package/dist/scripts/data-migration/dependency-manager.d.ts +0 -9
- package/dist/scripts/data-migration/dependency-manager.js +0 -86
- package/dist/scripts/data-migration/dependency-manager.js.map +0 -1
- package/dist/scripts/data-migration/migration-config.json +0 -63
- package/dist/scripts/data-migration/migration-phases.d.ts +0 -5
- package/dist/scripts/data-migration/migration-phases.js +0 -55
- package/dist/scripts/data-migration/migration-phases.js.map +0 -1
- package/dist/scripts/data-migration/multi-source-migrator.d.ts +0 -17
- package/dist/scripts/data-migration/multi-source-migrator.js +0 -130
- package/dist/scripts/data-migration/multi-source-migrator.js.map +0 -1
- package/dist/scripts/data-migration/phase-generator.d.ts +0 -15
- package/dist/scripts/data-migration/phase-generator.js +0 -187
- package/dist/scripts/data-migration/phase-generator.js.map +0 -1
- package/dist/scripts/data-migration.d.ts +0 -22
- package/dist/scripts/data-migration.js +0 -593
- package/dist/scripts/data-migration.js.map +0 -1
- package/dist/scripts/multi-db-migration.d.ts +0 -1
- package/dist/scripts/multi-db-migration.js +0 -55
- package/dist/scripts/multi-db-migration.js.map +0 -1
|
@@ -64,13 +64,13 @@ class BatchMigrator {
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
async fetchBatch(sourceSchema, tableConfig, offset, limit) {
|
|
67
|
-
const query = `
|
|
68
|
-
SELECT *
|
|
69
|
-
FROM "${sourceSchema}"."${tableConfig.sourceTable}"
|
|
70
|
-
${this.buildWhereClause(tableConfig)}
|
|
71
|
-
ORDER BY "${tableConfig.idField}"
|
|
72
|
-
LIMIT ${limit}
|
|
73
|
-
OFFSET ${offset}
|
|
67
|
+
const query = `
|
|
68
|
+
SELECT *
|
|
69
|
+
FROM "${sourceSchema}"."${tableConfig.sourceTable}"
|
|
70
|
+
${this.buildWhereClause(tableConfig)}
|
|
71
|
+
ORDER BY "${tableConfig.idField}"
|
|
72
|
+
LIMIT ${limit}
|
|
73
|
+
OFFSET ${offset}
|
|
74
74
|
`;
|
|
75
75
|
const result = await this.connections.sourcePool.query(query);
|
|
76
76
|
return result.rows;
|
|
@@ -121,11 +121,11 @@ class BatchMigrator {
|
|
|
121
121
|
const columns = Object.keys(record);
|
|
122
122
|
const values = Object.values(record);
|
|
123
123
|
const placeholders = values.map((_, i) => `$${i + 1}`).join(", ");
|
|
124
|
-
const query = `
|
|
125
|
-
INSERT INTO "${schema}"."${table}"
|
|
126
|
-
(${columns.map((col) => `"${col}"`).join(", ")})
|
|
127
|
-
VALUES (${placeholders})
|
|
128
|
-
ON CONFLICT DO NOTHING
|
|
124
|
+
const query = `
|
|
125
|
+
INSERT INTO "${schema}"."${table}"
|
|
126
|
+
(${columns.map((col) => `"${col}"`).join(", ")})
|
|
127
|
+
VALUES (${placeholders})
|
|
128
|
+
ON CONFLICT DO NOTHING
|
|
129
129
|
`;
|
|
130
130
|
await client.query(query, values);
|
|
131
131
|
}
|
|
@@ -55,12 +55,12 @@ class DataTransformer {
|
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
async getEnumTypeName(tableName, columnName) {
|
|
58
|
-
const result = await this.connections.sourcePool.query(`
|
|
59
|
-
SELECT udt_name
|
|
60
|
-
FROM information_schema.columns
|
|
61
|
-
WHERE table_name = $1
|
|
62
|
-
AND column_name = $2
|
|
63
|
-
AND table_schema = 'public'
|
|
58
|
+
const result = await this.connections.sourcePool.query(`
|
|
59
|
+
SELECT udt_name
|
|
60
|
+
FROM information_schema.columns
|
|
61
|
+
WHERE table_name = $1
|
|
62
|
+
AND column_name = $2
|
|
63
|
+
AND table_schema = 'public'
|
|
64
64
|
`, [tableName.replace(/^public\./, ""), columnName]);
|
|
65
65
|
if (result.rows.length === 0) {
|
|
66
66
|
throw new Error(`No se encontró el tipo de enum para ${tableName}.${columnName}`);
|
|
@@ -88,14 +88,14 @@ class DataTransformer {
|
|
|
88
88
|
if (enumDefaults[enumType]) {
|
|
89
89
|
return enumDefaults[enumType];
|
|
90
90
|
}
|
|
91
|
-
const query = `
|
|
92
|
-
SELECT e.enumlabel
|
|
93
|
-
FROM pg_type t
|
|
94
|
-
JOIN pg_enum e ON t.oid = e.enumtypid
|
|
95
|
-
JOIN pg_namespace n ON n.oid = t.typnamespace
|
|
96
|
-
WHERE t.typname = $1 AND n.nspname = $2
|
|
97
|
-
ORDER BY e.enumsortorder
|
|
98
|
-
LIMIT 1
|
|
91
|
+
const query = `
|
|
92
|
+
SELECT e.enumlabel
|
|
93
|
+
FROM pg_type t
|
|
94
|
+
JOIN pg_enum e ON t.oid = e.enumtypid
|
|
95
|
+
JOIN pg_namespace n ON n.oid = t.typnamespace
|
|
96
|
+
WHERE t.typname = $1 AND n.nspname = $2
|
|
97
|
+
ORDER BY e.enumsortorder
|
|
98
|
+
LIMIT 1
|
|
99
99
|
`;
|
|
100
100
|
const result = await this.schemaUtils.queryTargetDb(query, [
|
|
101
101
|
enumType,
|
|
@@ -74,11 +74,11 @@ class DependencyResolver {
|
|
|
74
74
|
this.tableOrder.push(table);
|
|
75
75
|
}
|
|
76
76
|
async getAllTables() {
|
|
77
|
-
const query = `
|
|
78
|
-
SELECT table_name
|
|
79
|
-
FROM information_schema.tables
|
|
80
|
-
WHERE table_schema = 'public'
|
|
81
|
-
AND table_type = 'BASE TABLE'
|
|
77
|
+
const query = `
|
|
78
|
+
SELECT table_name
|
|
79
|
+
FROM information_schema.tables
|
|
80
|
+
WHERE table_schema = 'public'
|
|
81
|
+
AND table_type = 'BASE TABLE'
|
|
82
82
|
`;
|
|
83
83
|
const result = await this.sourcePool.query(query);
|
|
84
84
|
return result.rows.map((row) => row.table_name);
|
|
@@ -88,17 +88,17 @@ class DependencyResolver {
|
|
|
88
88
|
const dependencies = new Set();
|
|
89
89
|
const configDeps = ((_c = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.tables) === null || _b === void 0 ? void 0 : _b[table]) === null || _c === void 0 ? void 0 : _c.dependencies) || [];
|
|
90
90
|
configDeps.forEach((dep) => dependencies.add(dep));
|
|
91
|
-
const query = `
|
|
92
|
-
SELECT
|
|
93
|
-
ccu.table_name AS foreign_table
|
|
94
|
-
FROM
|
|
95
|
-
information_schema.table_constraints tc
|
|
96
|
-
JOIN information_schema.constraint_column_usage ccu
|
|
97
|
-
ON ccu.constraint_name = tc.constraint_name
|
|
98
|
-
WHERE
|
|
99
|
-
tc.constraint_type = 'FOREIGN KEY'
|
|
100
|
-
AND tc.table_name = $1
|
|
101
|
-
AND tc.table_schema = 'public'
|
|
91
|
+
const query = `
|
|
92
|
+
SELECT
|
|
93
|
+
ccu.table_name AS foreign_table
|
|
94
|
+
FROM
|
|
95
|
+
information_schema.table_constraints tc
|
|
96
|
+
JOIN information_schema.constraint_column_usage ccu
|
|
97
|
+
ON ccu.constraint_name = tc.constraint_name
|
|
98
|
+
WHERE
|
|
99
|
+
tc.constraint_type = 'FOREIGN KEY'
|
|
100
|
+
AND tc.table_name = $1
|
|
101
|
+
AND tc.table_schema = 'public'
|
|
102
102
|
`;
|
|
103
103
|
try {
|
|
104
104
|
const result = await this.sourcePool.query(query, [table]);
|
|
@@ -111,13 +111,13 @@ class DependencyResolver {
|
|
|
111
111
|
}
|
|
112
112
|
async validateDependencies(table, dependencies) {
|
|
113
113
|
for (const dep of dependencies) {
|
|
114
|
-
const query = `
|
|
115
|
-
SELECT EXISTS (
|
|
116
|
-
SELECT 1
|
|
117
|
-
FROM information_schema.tables
|
|
118
|
-
WHERE table_schema = 'public'
|
|
119
|
-
AND table_name = $1
|
|
120
|
-
)
|
|
114
|
+
const query = `
|
|
115
|
+
SELECT EXISTS (
|
|
116
|
+
SELECT 1
|
|
117
|
+
FROM information_schema.tables
|
|
118
|
+
WHERE table_schema = 'public'
|
|
119
|
+
AND table_name = $1
|
|
120
|
+
)
|
|
121
121
|
`;
|
|
122
122
|
const result = await this.sourcePool.query(query, [dep]);
|
|
123
123
|
if (!result.rows[0].exists) {
|
|
@@ -43,13 +43,13 @@ class EntityDiscovery {
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
async getPrimaryKey(schemaName, tableName) {
|
|
46
|
-
const query = `
|
|
47
|
-
SELECT a.attname
|
|
48
|
-
FROM pg_index i
|
|
49
|
-
JOIN pg_attribute a ON a.attrelid = i.indrelid
|
|
50
|
-
AND a.attnum = ANY(i.indkey)
|
|
51
|
-
WHERE i.indrelid = '"${schemaName}"."${tableName}"'::regclass
|
|
52
|
-
AND i.indisprimary;
|
|
46
|
+
const query = `
|
|
47
|
+
SELECT a.attname
|
|
48
|
+
FROM pg_index i
|
|
49
|
+
JOIN pg_attribute a ON a.attrelid = i.indrelid
|
|
50
|
+
AND a.attnum = ANY(i.indkey)
|
|
51
|
+
WHERE i.indrelid = '"${schemaName}"."${tableName}"'::regclass
|
|
52
|
+
AND i.indisprimary;
|
|
53
53
|
`;
|
|
54
54
|
try {
|
|
55
55
|
const { rows } = await this.targetPool.query(query);
|
|
@@ -61,23 +61,23 @@ class EntityDiscovery {
|
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
async getForeignKeys(schemaName, tableName) {
|
|
64
|
-
const query = `
|
|
65
|
-
SELECT
|
|
66
|
-
kcu.column_name,
|
|
67
|
-
ccu.table_name AS foreign_table_name,
|
|
68
|
-
ccu.column_name AS foreign_column_name
|
|
69
|
-
FROM
|
|
70
|
-
information_schema.table_constraints tc
|
|
71
|
-
JOIN information_schema.key_column_usage kcu
|
|
72
|
-
ON tc.constraint_name = kcu.constraint_name
|
|
73
|
-
AND tc.table_schema = kcu.table_schema
|
|
74
|
-
JOIN information_schema.constraint_column_usage ccu
|
|
75
|
-
ON ccu.constraint_name = tc.constraint_name
|
|
76
|
-
AND ccu.table_schema = tc.table_schema
|
|
77
|
-
WHERE
|
|
78
|
-
tc.constraint_type = 'FOREIGN KEY'
|
|
79
|
-
AND tc.table_schema = $1
|
|
80
|
-
AND tc.table_name = $2;
|
|
64
|
+
const query = `
|
|
65
|
+
SELECT
|
|
66
|
+
kcu.column_name,
|
|
67
|
+
ccu.table_name AS foreign_table_name,
|
|
68
|
+
ccu.column_name AS foreign_column_name
|
|
69
|
+
FROM
|
|
70
|
+
information_schema.table_constraints tc
|
|
71
|
+
JOIN information_schema.key_column_usage kcu
|
|
72
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
73
|
+
AND tc.table_schema = kcu.table_schema
|
|
74
|
+
JOIN information_schema.constraint_column_usage ccu
|
|
75
|
+
ON ccu.constraint_name = tc.constraint_name
|
|
76
|
+
AND ccu.table_schema = tc.table_schema
|
|
77
|
+
WHERE
|
|
78
|
+
tc.constraint_type = 'FOREIGN KEY'
|
|
79
|
+
AND tc.table_schema = $1
|
|
80
|
+
AND tc.table_name = $2;
|
|
81
81
|
`;
|
|
82
82
|
try {
|
|
83
83
|
const { rows } = await this.targetPool.query(query, [schemaName, tableName]);
|
|
@@ -89,50 +89,50 @@ class EntityDiscovery {
|
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
async findJoinTables(schemaName, sourceTable, targetTable) {
|
|
92
|
-
const query = `
|
|
93
|
-
WITH source_fks AS (
|
|
94
|
-
SELECT
|
|
95
|
-
tc.table_name,
|
|
96
|
-
kcu.column_name,
|
|
97
|
-
ccu.table_name AS referenced_table
|
|
98
|
-
FROM
|
|
99
|
-
information_schema.table_constraints tc
|
|
100
|
-
JOIN information_schema.key_column_usage kcu
|
|
101
|
-
ON tc.constraint_name = kcu.constraint_name
|
|
102
|
-
AND tc.table_schema = kcu.table_schema
|
|
103
|
-
JOIN information_schema.constraint_column_usage ccu
|
|
104
|
-
ON ccu.constraint_name = tc.constraint_name
|
|
105
|
-
AND ccu.table_schema = tc.table_schema
|
|
106
|
-
WHERE
|
|
107
|
-
tc.constraint_type = 'FOREIGN KEY'
|
|
108
|
-
AND tc.table_schema = $1
|
|
109
|
-
AND ccu.table_name = $2
|
|
110
|
-
),
|
|
111
|
-
target_fks AS (
|
|
112
|
-
SELECT
|
|
113
|
-
tc.table_name,
|
|
114
|
-
kcu.column_name,
|
|
115
|
-
ccu.table_name AS referenced_table
|
|
116
|
-
FROM
|
|
117
|
-
information_schema.table_constraints tc
|
|
118
|
-
JOIN information_schema.key_column_usage kcu
|
|
119
|
-
ON tc.constraint_name = kcu.constraint_name
|
|
120
|
-
AND tc.table_schema = kcu.table_schema
|
|
121
|
-
JOIN information_schema.constraint_column_usage ccu
|
|
122
|
-
ON ccu.constraint_name = tc.constraint_name
|
|
123
|
-
AND ccu.table_schema = tc.table_schema
|
|
124
|
-
WHERE
|
|
125
|
-
tc.constraint_type = 'FOREIGN KEY'
|
|
126
|
-
AND tc.table_schema = $1
|
|
127
|
-
AND ccu.table_name = $3
|
|
128
|
-
)
|
|
129
|
-
SELECT
|
|
130
|
-
s.table_name AS join_table,
|
|
131
|
-
s.column_name AS source_column,
|
|
132
|
-
t.column_name AS target_column
|
|
133
|
-
FROM
|
|
134
|
-
source_fks s
|
|
135
|
-
JOIN target_fks t ON s.table_name = t.table_name
|
|
92
|
+
const query = `
|
|
93
|
+
WITH source_fks AS (
|
|
94
|
+
SELECT
|
|
95
|
+
tc.table_name,
|
|
96
|
+
kcu.column_name,
|
|
97
|
+
ccu.table_name AS referenced_table
|
|
98
|
+
FROM
|
|
99
|
+
information_schema.table_constraints tc
|
|
100
|
+
JOIN information_schema.key_column_usage kcu
|
|
101
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
102
|
+
AND tc.table_schema = kcu.table_schema
|
|
103
|
+
JOIN information_schema.constraint_column_usage ccu
|
|
104
|
+
ON ccu.constraint_name = tc.constraint_name
|
|
105
|
+
AND ccu.table_schema = tc.table_schema
|
|
106
|
+
WHERE
|
|
107
|
+
tc.constraint_type = 'FOREIGN KEY'
|
|
108
|
+
AND tc.table_schema = $1
|
|
109
|
+
AND ccu.table_name = $2
|
|
110
|
+
),
|
|
111
|
+
target_fks AS (
|
|
112
|
+
SELECT
|
|
113
|
+
tc.table_name,
|
|
114
|
+
kcu.column_name,
|
|
115
|
+
ccu.table_name AS referenced_table
|
|
116
|
+
FROM
|
|
117
|
+
information_schema.table_constraints tc
|
|
118
|
+
JOIN information_schema.key_column_usage kcu
|
|
119
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
120
|
+
AND tc.table_schema = kcu.table_schema
|
|
121
|
+
JOIN information_schema.constraint_column_usage ccu
|
|
122
|
+
ON ccu.constraint_name = tc.constraint_name
|
|
123
|
+
AND ccu.table_schema = tc.table_schema
|
|
124
|
+
WHERE
|
|
125
|
+
tc.constraint_type = 'FOREIGN KEY'
|
|
126
|
+
AND tc.table_schema = $1
|
|
127
|
+
AND ccu.table_name = $3
|
|
128
|
+
)
|
|
129
|
+
SELECT
|
|
130
|
+
s.table_name AS join_table,
|
|
131
|
+
s.column_name AS source_column,
|
|
132
|
+
t.column_name AS target_column
|
|
133
|
+
FROM
|
|
134
|
+
source_fks s
|
|
135
|
+
JOIN target_fks t ON s.table_name = t.table_name
|
|
136
136
|
`;
|
|
137
137
|
try {
|
|
138
138
|
const { rows } = await this.targetPool.query(query, [
|
|
@@ -15,23 +15,23 @@ class ForeignKeyManager {
|
|
|
15
15
|
}
|
|
16
16
|
try {
|
|
17
17
|
this.logger.log(`Obteniendo dependencias de llaves foráneas para ${schemaName}.${tableName}`);
|
|
18
|
-
const query = `
|
|
19
|
-
SELECT
|
|
20
|
-
kcu.column_name,
|
|
21
|
-
ccu.table_name AS foreign_table_name,
|
|
22
|
-
ccu.column_name AS foreign_column_name
|
|
23
|
-
FROM
|
|
24
|
-
information_schema.table_constraints tc
|
|
25
|
-
JOIN information_schema.key_column_usage kcu
|
|
26
|
-
ON tc.constraint_name = kcu.constraint_name
|
|
27
|
-
AND tc.table_schema = kcu.table_schema
|
|
28
|
-
JOIN information_schema.constraint_column_usage ccu
|
|
29
|
-
ON ccu.constraint_name = tc.constraint_name
|
|
30
|
-
AND ccu.table_schema = tc.table_schema
|
|
31
|
-
WHERE
|
|
32
|
-
tc.constraint_type = 'FOREIGN KEY'
|
|
33
|
-
AND tc.table_schema = $1
|
|
34
|
-
AND tc.table_name = $2;
|
|
18
|
+
const query = `
|
|
19
|
+
SELECT
|
|
20
|
+
kcu.column_name,
|
|
21
|
+
ccu.table_name AS foreign_table_name,
|
|
22
|
+
ccu.column_name AS foreign_column_name
|
|
23
|
+
FROM
|
|
24
|
+
information_schema.table_constraints tc
|
|
25
|
+
JOIN information_schema.key_column_usage kcu
|
|
26
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
27
|
+
AND tc.table_schema = kcu.table_schema
|
|
28
|
+
JOIN information_schema.constraint_column_usage ccu
|
|
29
|
+
ON ccu.constraint_name = tc.constraint_name
|
|
30
|
+
AND ccu.table_schema = tc.table_schema
|
|
31
|
+
WHERE
|
|
32
|
+
tc.constraint_type = 'FOREIGN KEY'
|
|
33
|
+
AND tc.table_schema = $1
|
|
34
|
+
AND tc.table_name = $2;
|
|
35
35
|
`;
|
|
36
36
|
const { rows } = await this.connections.targetPool.query(query, [
|
|
37
37
|
schemaName,
|
|
@@ -42,7 +42,7 @@ class ForeignKeyManager {
|
|
|
42
42
|
foreignTable: row.foreign_table_name,
|
|
43
43
|
foreignColumn: row.foreign_column_name,
|
|
44
44
|
}));
|
|
45
|
-
this.logger.log(`Encontradas ${dependencies.length} dependencias para ${schemaName}.${tableName}:
|
|
45
|
+
this.logger.log(`Encontradas ${dependencies.length} dependencias para ${schemaName}.${tableName}:
|
|
46
46
|
${dependencies
|
|
47
47
|
.map((d) => `\n - ${d.column} -> ${d.foreignTable}.${d.foreignColumn}`)
|
|
48
48
|
.join("")}`);
|
|
@@ -81,7 +81,7 @@ class ForeignKeyManager {
|
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
if (missingDependencies.length > 0) {
|
|
84
|
-
this.logger.debug(`Registro ${recordId}: Faltan ${missingDependencies.length} dependencias:
|
|
84
|
+
this.logger.debug(`Registro ${recordId}: Faltan ${missingDependencies.length} dependencias:
|
|
85
85
|
${missingDependencies.map((dep) => `\n - ${dep}`).join("")}`);
|
|
86
86
|
}
|
|
87
87
|
else {
|
|
@@ -141,10 +141,10 @@ class ForeignKeyManager {
|
|
|
141
141
|
}
|
|
142
142
|
async checkTableExists(tableName) {
|
|
143
143
|
try {
|
|
144
|
-
const result = await this.connections.sourcePool.query(`SELECT EXISTS (
|
|
145
|
-
SELECT FROM information_schema.tables
|
|
146
|
-
WHERE table_schema = 'public'
|
|
147
|
-
AND table_name = $1
|
|
144
|
+
const result = await this.connections.sourcePool.query(`SELECT EXISTS (
|
|
145
|
+
SELECT FROM information_schema.tables
|
|
146
|
+
WHERE table_schema = 'public'
|
|
147
|
+
AND table_name = $1
|
|
148
148
|
)`, [tableName]);
|
|
149
149
|
const exists = result.rows[0].exists;
|
|
150
150
|
this.logger.debug(`Verificación de existencia de tabla ${tableName}: ${exists ? "EXISTE" : "NO EXISTE"}`);
|
|
@@ -113,11 +113,11 @@ class DataMigrationTool {
|
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
115
|
this.logger.debug(`Validation check: Using ${transactionTableKey}.${transactionProviderFk} referencing ${providerTableKey}.${providerIdColumn}`);
|
|
116
|
-
const query = `
|
|
117
|
-
SELECT t."${tablesConfig[transactionTableKey].idField}" AS transaction_id, t."${transactionProviderFk}"
|
|
118
|
-
FROM "${transactionTableKey}" t
|
|
119
|
-
LEFT JOIN "${providerTableKey}" p ON t."${transactionProviderFk}" = p."${providerIdColumn}"
|
|
120
|
-
WHERE t."${transactionProviderFk}" IS NOT NULL AND p."${providerIdColumn}" IS NULL;
|
|
116
|
+
const query = `
|
|
117
|
+
SELECT t."${tablesConfig[transactionTableKey].idField}" AS transaction_id, t."${transactionProviderFk}"
|
|
118
|
+
FROM "${transactionTableKey}" t
|
|
119
|
+
LEFT JOIN "${providerTableKey}" p ON t."${transactionProviderFk}" = p."${providerIdColumn}"
|
|
120
|
+
WHERE t."${transactionProviderFk}" IS NOT NULL AND p."${providerIdColumn}" IS NULL;
|
|
121
121
|
`;
|
|
122
122
|
const invalidTransactions = (await this.connections.sourcePrisma.$queryRawUnsafe(query));
|
|
123
123
|
if (invalidTransactions.length > 0) {
|
|
@@ -11,28 +11,28 @@ class SchemaUtils {
|
|
|
11
11
|
const pool = dbType === "source"
|
|
12
12
|
? this.connections.sourcePool
|
|
13
13
|
: this.connections.targetPool;
|
|
14
|
-
const query = `
|
|
15
|
-
SELECT
|
|
16
|
-
c.table_name,
|
|
17
|
-
c.column_name,
|
|
18
|
-
c.data_type,
|
|
19
|
-
c.udt_name,
|
|
20
|
-
c.character_maximum_length,
|
|
21
|
-
c.is_nullable,
|
|
22
|
-
c.column_default,
|
|
23
|
-
tc.constraint_type
|
|
24
|
-
FROM
|
|
25
|
-
information_schema.columns c
|
|
26
|
-
LEFT JOIN information_schema.constraint_column_usage ccu
|
|
27
|
-
ON c.column_name = ccu.column_name
|
|
28
|
-
AND c.table_name = ccu.table_name
|
|
29
|
-
LEFT JOIN information_schema.table_constraints tc
|
|
30
|
-
ON ccu.constraint_name = tc.constraint_name
|
|
31
|
-
WHERE
|
|
32
|
-
c.table_schema = $1
|
|
33
|
-
AND c.table_name = $2
|
|
34
|
-
ORDER BY
|
|
35
|
-
c.ordinal_position
|
|
14
|
+
const query = `
|
|
15
|
+
SELECT
|
|
16
|
+
c.table_name,
|
|
17
|
+
c.column_name,
|
|
18
|
+
c.data_type,
|
|
19
|
+
c.udt_name,
|
|
20
|
+
c.character_maximum_length,
|
|
21
|
+
c.is_nullable,
|
|
22
|
+
c.column_default,
|
|
23
|
+
tc.constraint_type
|
|
24
|
+
FROM
|
|
25
|
+
information_schema.columns c
|
|
26
|
+
LEFT JOIN information_schema.constraint_column_usage ccu
|
|
27
|
+
ON c.column_name = ccu.column_name
|
|
28
|
+
AND c.table_name = ccu.table_name
|
|
29
|
+
LEFT JOIN information_schema.table_constraints tc
|
|
30
|
+
ON ccu.constraint_name = tc.constraint_name
|
|
31
|
+
WHERE
|
|
32
|
+
c.table_schema = $1
|
|
33
|
+
AND c.table_name = $2
|
|
34
|
+
ORDER BY
|
|
35
|
+
c.ordinal_position
|
|
36
36
|
`;
|
|
37
37
|
try {
|
|
38
38
|
const result = await pool.query(query, [schema, tableName]);
|
|
@@ -45,10 +45,10 @@ class SchemaUtils {
|
|
|
45
45
|
}
|
|
46
46
|
async checkSchemaExists(schemaName) {
|
|
47
47
|
try {
|
|
48
|
-
const query = `
|
|
49
|
-
SELECT schema_name
|
|
50
|
-
FROM information_schema.schemata
|
|
51
|
-
WHERE schema_name = $1
|
|
48
|
+
const query = `
|
|
49
|
+
SELECT schema_name
|
|
50
|
+
FROM information_schema.schemata
|
|
51
|
+
WHERE schema_name = $1
|
|
52
52
|
`;
|
|
53
53
|
const result = await this.connections.targetPool.query(query, [
|
|
54
54
|
schemaName,
|
|
@@ -62,11 +62,11 @@ class SchemaUtils {
|
|
|
62
62
|
}
|
|
63
63
|
async getTargetTables(schemaName) {
|
|
64
64
|
try {
|
|
65
|
-
const query = `
|
|
66
|
-
SELECT table_name
|
|
67
|
-
FROM information_schema.tables
|
|
68
|
-
WHERE table_schema = $1
|
|
69
|
-
AND table_type = 'BASE TABLE'
|
|
65
|
+
const query = `
|
|
66
|
+
SELECT table_name
|
|
67
|
+
FROM information_schema.tables
|
|
68
|
+
WHERE table_schema = $1
|
|
69
|
+
AND table_type = 'BASE TABLE'
|
|
70
70
|
`;
|
|
71
71
|
const result = await this.connections.targetPool.query(query, [
|
|
72
72
|
schemaName,
|
|
@@ -84,13 +84,13 @@ class SchemaUtils {
|
|
|
84
84
|
}
|
|
85
85
|
async getEnumValues(schemaName, enumName) {
|
|
86
86
|
try {
|
|
87
|
-
const query = `
|
|
88
|
-
SELECT e.enumlabel
|
|
89
|
-
FROM pg_type t
|
|
90
|
-
JOIN pg_enum e ON t.oid = e.enumtypid
|
|
91
|
-
JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
|
|
92
|
-
WHERE t.typname = $1
|
|
93
|
-
AND n.nspname = $2
|
|
87
|
+
const query = `
|
|
88
|
+
SELECT e.enumlabel
|
|
89
|
+
FROM pg_type t
|
|
90
|
+
JOIN pg_enum e ON t.oid = e.enumtypid
|
|
91
|
+
JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
|
|
92
|
+
WHERE t.typname = $1
|
|
93
|
+
AND n.nspname = $2
|
|
94
94
|
`;
|
|
95
95
|
const result = await this.connections.targetPool.query(query, [
|
|
96
96
|
enumName,
|
|
@@ -112,25 +112,25 @@ class SchemaUtils {
|
|
|
112
112
|
async createMissingColumns(tableName, schema, columns) {
|
|
113
113
|
for (const column of columns) {
|
|
114
114
|
try {
|
|
115
|
-
const query = `
|
|
116
|
-
ALTER TABLE "${schema}"."${tableName}"
|
|
117
|
-
ADD COLUMN IF NOT EXISTS "${column.column_name}" ${column.data_type}
|
|
118
|
-
${column.is_nullable === "NO" ? "NOT NULL" : ""}
|
|
119
|
-
${column.column_default ? `DEFAULT ${column.column_default}` : ""}
|
|
115
|
+
const query = `
|
|
116
|
+
ALTER TABLE "${schema}"."${tableName}"
|
|
117
|
+
ADD COLUMN IF NOT EXISTS "${column.column_name}" ${column.data_type}
|
|
118
|
+
${column.is_nullable === "NO" ? "NOT NULL" : ""}
|
|
119
|
+
${column.column_default ? `DEFAULT ${column.column_default}` : ""}
|
|
120
120
|
`;
|
|
121
121
|
await this.connections.targetPool.query(query);
|
|
122
122
|
if (column.constraint_type === "UNIQUE") {
|
|
123
123
|
const constraintName = `${tableName}_${column.column_name}_unique`;
|
|
124
|
-
const uniqueQuery = `
|
|
125
|
-
DO $$
|
|
126
|
-
BEGIN
|
|
127
|
-
IF NOT EXISTS (
|
|
128
|
-
SELECT 1 FROM pg_constraint WHERE conname = '${constraintName}'
|
|
129
|
-
) THEN
|
|
130
|
-
ALTER TABLE "${schema}"."${tableName}"
|
|
131
|
-
ADD CONSTRAINT "${constraintName}" UNIQUE ("${column.column_name}");
|
|
132
|
-
END IF;
|
|
133
|
-
END $$;
|
|
124
|
+
const uniqueQuery = `
|
|
125
|
+
DO $$
|
|
126
|
+
BEGIN
|
|
127
|
+
IF NOT EXISTS (
|
|
128
|
+
SELECT 1 FROM pg_constraint WHERE conname = '${constraintName}'
|
|
129
|
+
) THEN
|
|
130
|
+
ALTER TABLE "${schema}"."${tableName}"
|
|
131
|
+
ADD CONSTRAINT "${constraintName}" UNIQUE ("${column.column_name}");
|
|
132
|
+
END IF;
|
|
133
|
+
END $$;
|
|
134
134
|
`;
|
|
135
135
|
await this.connections.targetPool.query(uniqueQuery);
|
|
136
136
|
}
|
|
@@ -146,10 +146,10 @@ class SchemaUtils {
|
|
|
146
146
|
await this.connections.targetPool.query(`CREATE SCHEMA IF NOT EXISTS "${schemaName}"`);
|
|
147
147
|
const tables = await this.getPublicTables();
|
|
148
148
|
for (const table of tables) {
|
|
149
|
-
await this.connections.targetPool.query(`
|
|
150
|
-
CREATE TABLE IF NOT EXISTS "${schemaName}"."${table}" (
|
|
151
|
-
LIKE public."${table}" INCLUDING ALL
|
|
152
|
-
);
|
|
149
|
+
await this.connections.targetPool.query(`
|
|
150
|
+
CREATE TABLE IF NOT EXISTS "${schemaName}"."${table}" (
|
|
151
|
+
LIKE public."${table}" INCLUDING ALL
|
|
152
|
+
);
|
|
153
153
|
`);
|
|
154
154
|
}
|
|
155
155
|
this.logger.log(`Created schema ${schemaName} with all tables`);
|
|
@@ -160,27 +160,27 @@ class SchemaUtils {
|
|
|
160
160
|
}
|
|
161
161
|
}
|
|
162
162
|
async getPublicTables() {
|
|
163
|
-
const result = await this.connections.targetPool.query(`
|
|
164
|
-
SELECT tablename
|
|
165
|
-
FROM pg_tables
|
|
166
|
-
WHERE schemaname = 'public'
|
|
163
|
+
const result = await this.connections.targetPool.query(`
|
|
164
|
+
SELECT tablename
|
|
165
|
+
FROM pg_tables
|
|
166
|
+
WHERE schemaname = 'public'
|
|
167
167
|
`);
|
|
168
168
|
return result.rows.map((row) => row.tablename);
|
|
169
169
|
}
|
|
170
170
|
async getTableColumns(schema, table) {
|
|
171
|
-
const query = `
|
|
172
|
-
SELECT
|
|
173
|
-
column_name,
|
|
174
|
-
data_type,
|
|
175
|
-
is_nullable,
|
|
176
|
-
column_default,
|
|
177
|
-
character_maximum_length,
|
|
178
|
-
numeric_precision,
|
|
179
|
-
numeric_scale
|
|
180
|
-
FROM information_schema.columns
|
|
181
|
-
WHERE table_schema = $1
|
|
182
|
-
AND table_name = $2
|
|
183
|
-
ORDER BY ordinal_position;
|
|
171
|
+
const query = `
|
|
172
|
+
SELECT
|
|
173
|
+
column_name,
|
|
174
|
+
data_type,
|
|
175
|
+
is_nullable,
|
|
176
|
+
column_default,
|
|
177
|
+
character_maximum_length,
|
|
178
|
+
numeric_precision,
|
|
179
|
+
numeric_scale
|
|
180
|
+
FROM information_schema.columns
|
|
181
|
+
WHERE table_schema = $1
|
|
182
|
+
AND table_name = $2
|
|
183
|
+
ORDER BY ordinal_position;
|
|
184
184
|
`;
|
|
185
185
|
try {
|
|
186
186
|
const result = await this.connections.sourcePool.query(query, [
|
|
@@ -56,10 +56,10 @@ class TypecastManager {
|
|
|
56
56
|
return tableSchema === null || tableSchema === void 0 ? void 0 : tableSchema.get(columnName);
|
|
57
57
|
}
|
|
58
58
|
async loadTableSchema(tableName) {
|
|
59
|
-
const columns = await this.prisma.$queryRawUnsafe(`
|
|
60
|
-
SELECT column_name, data_type, udt_name, is_nullable
|
|
61
|
-
FROM information_schema.columns
|
|
62
|
-
WHERE table_name = '${tableName}'
|
|
59
|
+
const columns = await this.prisma.$queryRawUnsafe(`
|
|
60
|
+
SELECT column_name, data_type, udt_name, is_nullable
|
|
61
|
+
FROM information_schema.columns
|
|
62
|
+
WHERE table_name = '${tableName}'
|
|
63
63
|
`);
|
|
64
64
|
const tableSchema = new Map();
|
|
65
65
|
for (const column of columns) {
|
|
@@ -14,11 +14,11 @@ class DatabaseInitializer {
|
|
|
14
14
|
const { Pool } = await Promise.resolve().then(() => require("pg"));
|
|
15
15
|
const pool = new Pool({ connectionString: this.databaseUrl });
|
|
16
16
|
try {
|
|
17
|
-
const result = await pool.query(`
|
|
18
|
-
SELECT COUNT(*)
|
|
19
|
-
FROM information_schema.tables
|
|
20
|
-
WHERE table_schema = 'public'
|
|
21
|
-
AND table_type = 'BASE TABLE'
|
|
17
|
+
const result = await pool.query(`
|
|
18
|
+
SELECT COUNT(*)
|
|
19
|
+
FROM information_schema.tables
|
|
20
|
+
WHERE table_schema = 'public'
|
|
21
|
+
AND table_type = 'BASE TABLE'
|
|
22
22
|
`);
|
|
23
23
|
const tableCount = parseInt(result.rows[0].count);
|
|
24
24
|
if (tableCount === 0) {
|
|
@@ -41,11 +41,11 @@ class DatabaseDropTool {
|
|
|
41
41
|
async terminateConnections(dbName) {
|
|
42
42
|
this.logger.log(`Terminating all connections to database: ${dbName}`);
|
|
43
43
|
try {
|
|
44
|
-
await this.adminPool.query(`
|
|
45
|
-
SELECT pg_terminate_backend(pg_stat_activity.pid)
|
|
46
|
-
FROM pg_stat_activity
|
|
47
|
-
WHERE pg_stat_activity.datname = $1
|
|
48
|
-
AND pid <> pg_backend_pid()
|
|
44
|
+
await this.adminPool.query(`
|
|
45
|
+
SELECT pg_terminate_backend(pg_stat_activity.pid)
|
|
46
|
+
FROM pg_stat_activity
|
|
47
|
+
WHERE pg_stat_activity.datname = $1
|
|
48
|
+
AND pid <> pg_backend_pid()
|
|
49
49
|
`, [dbName]);
|
|
50
50
|
this.logger.log("All connections terminated successfully");
|
|
51
51
|
}
|