diff --git a/packages/tools/src/DatabaseAnalyser.ts b/packages/tools/src/DatabaseAnalyser.ts index b068b0826..b0e622616 100644 --- a/packages/tools/src/DatabaseAnalyser.ts +++ b/packages/tools/src/DatabaseAnalyser.ts @@ -359,7 +359,7 @@ export class DatabaseAnalyser { } static byTableFilter(table) { - return x => x.pureName == table.pureName && x.schemaName == x.schemaName; + return x => x.pureName == table.pureName && x.schemaName == table.schemaName; } static extractPrimaryKeys(table, pkColumns) { diff --git a/plugins/dbgate-plugin-postgres/src/backend/Analyser.js b/plugins/dbgate-plugin-postgres/src/backend/Analyser.js index bae89b4eb..2823ade51 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/Analyser.js +++ b/plugins/dbgate-plugin-postgres/src/backend/Analyser.js @@ -97,30 +97,30 @@ class Analyser extends DatabaseAnalyser { let fkColumns = null; this.feedback({ analysingMessage: 'Loading foreign key constraints' }); - const fk_tableConstraints = await this.analyserQuery('fk_tableConstraints', ['tables']); + // const fk_tableConstraints = await this.analyserQuery('fk_tableConstraints', ['tables']); this.feedback({ analysingMessage: 'Loading foreign key refs' }); - const fk_referentialConstraints = await this.analyserQuery('fk_referentialConstraints', ['tables']); + const foreignKeys = await this.analyserQuery('foreignKeys', ['tables']); this.feedback({ analysingMessage: 'Loading foreign key columns' }); const fk_keyColumnUsage = await this.analyserQuery('fk_keyColumnUsage', ['tables']); - const cntKey = x => `${x.constraint_name}|${x.constraint_schema}`; + // const cntKey = x => `${x.constraint_name}|${x.constraint_schema}`; const fkRows = []; - const fkConstraintDct = _.keyBy(fk_tableConstraints.rows, cntKey); - for (const fkRef of fk_referentialConstraints.rows) { - const cntBase = fkConstraintDct[cntKey(fkRef)]; - const cntRef = fkConstraintDct[`${fkRef.unique_constraint_name}|${fkRef.unique_constraint_schema}`]; - if (!cntBase || !cntRef) continue; + // const fkConstraintDct = _.keyBy(fk_tableConstraints.rows, cntKey); + for (const fkRef of foreignKeys.rows) { + // const cntBase = fkConstraintDct[cntKey(fkRef)]; + // const cntRef = fkConstraintDct[`${fkRef.unique_constraint_name}|${fkRef.unique_constraint_schema}`]; + // if (!cntBase || !cntRef) continue; const baseCols = _.sortBy( fk_keyColumnUsage.rows.filter( - x => x.table_name == cntBase.table_name && x.constraint_name == cntBase.constraint_name + x => x.table_name == fkRef.table_name && x.constraint_name == fkRef.constraint_name && x.table_schema == fkRef.table_schema ), 'ordinal_position' ); const refCols = _.sortBy( fk_keyColumnUsage.rows.filter( - x => x.table_name == cntRef.table_name && x.constraint_name == cntRef.constraint_name + x => x.table_name == fkRef.ref_table_name && x.constraint_name == fkRef.unique_constraint_name && x.table_schema == fkRef.ref_table_schema ), 'ordinal_position' ); @@ -132,10 +132,10 @@ class Analyser extends DatabaseAnalyser { fkRows.push({ ...fkRef, - pure_name: cntBase.table_name, - schema_name: cntBase.table_schema, - ref_table_name: cntRef.table_name, - ref_schema_name: cntRef.table_schema, + pure_name: fkRef.table_name, + schema_name: fkRef.table_schema, + ref_table_name: fkRef.ref_table_name, + ref_schema_name: fkRef.ref_table_schema, column_name: baseCol.column_name, ref_column_name: refCol.column_name, }); diff --git a/plugins/dbgate-plugin-postgres/src/backend/sql/fk_referential_constraints.js b/plugins/dbgate-plugin-postgres/src/backend/sql/fk_referential_constraints.js deleted file mode 100644 index 243272efb..000000000 --- a/plugins/dbgate-plugin-postgres/src/backend/sql/fk_referential_constraints.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = ` -select - fk.constraint_name as "constraint_name", - fk.constraint_schema as "constraint_schema", - fk.update_rule as "update_action", - fk.delete_rule as "delete_action", - fk.unique_constraint_name as "unique_constraint_name", - fk.unique_constraint_schema as "unique_constraint_schema" -from information_schema.referential_constraints fk -where fk.constraint_schema =SCHEMA_NAME_CONDITION -`; diff --git a/plugins/dbgate-plugin-postgres/src/backend/sql/fk_table_constraints.js b/plugins/dbgate-plugin-postgres/src/backend/sql/fk_table_constraints.js deleted file mode 100644 index f381ff0e9..000000000 --- a/plugins/dbgate-plugin-postgres/src/backend/sql/fk_table_constraints.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = ` -select - base.table_name as "table_name", - base.table_schema as "table_schema", - base.constraint_name as "constraint_name", - base.constraint_schema as "constraint_schema" -from information_schema.table_constraints base -where ('tables:' || base.table_schema || '.' || base.table_name) =OBJECT_ID_CONDITION and base.table_schema =SCHEMA_NAME_CONDITION -`; diff --git a/plugins/dbgate-plugin-postgres/src/backend/sql/foreignKeys.js b/plugins/dbgate-plugin-postgres/src/backend/sql/foreignKeys.js new file mode 100644 index 000000000..cbd33e1d7 --- /dev/null +++ b/plugins/dbgate-plugin-postgres/src/backend/sql/foreignKeys.js @@ -0,0 +1,20 @@ +module.exports = ` +SELECT + nsp.nspname AS table_schema, + rel.relname AS table_name, + con.conname AS constraint_name, + nsp2.nspname AS ref_table_schema, + rel2.relname AS ref_table_name, + conpk.conname AS unique_constraint_name +FROM pg_constraint con +JOIN pg_class rel ON rel.oid = con.conrelid +JOIN pg_namespace nsp ON nsp.oid = rel.relnamespace +JOIN pg_class rel2 ON rel2.oid = con.confrelid +JOIN pg_namespace nsp2 ON nsp2.oid = rel2.relnamespace +JOIN pg_constraint conpk + ON conpk.conrelid = con.confrelid + AND conpk.conkey = con.confkey + AND conpk.contype IN ('p','u') -- 'p' = primary key, 'u' = unique constraint +WHERE con.contype = 'f' AND ('tables:' || nsp.nspname || '.' || rel.relname) =OBJECT_ID_CONDITION AND nsp.nspname =SCHEMA_NAME_CONDITION +; +`; diff --git a/plugins/dbgate-plugin-postgres/src/backend/sql/index.js b/plugins/dbgate-plugin-postgres/src/backend/sql/index.js index b3f338646..e57203fe9 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/sql/index.js +++ b/plugins/dbgate-plugin-postgres/src/backend/sql/index.js @@ -15,10 +15,8 @@ const uniqueNames = require('./uniqueNames'); const geometryColumns = require('./geometryColumns'); const geographyColumns = require('./geographyColumns'); const proceduresParameters = require('./proceduresParameters'); - +const foreignKeys = require('./foreignKeys'); const fk_keyColumnUsage = require('./fk_key_column_usage'); -const fk_referentialConstraints = require('./fk_referential_constraints'); -const fk_tableConstraints = require('./fk_table_constraints'); module.exports = { columns, @@ -27,8 +25,7 @@ module.exports = { viewModifications, primaryKeys, fk_keyColumnUsage, - fk_referentialConstraints, - fk_tableConstraints, + foreignKeys, views, routines, routineModifications, diff --git a/plugins/dbgate-plugin-postgres/src/backend/sql/primaryKeys.js b/plugins/dbgate-plugin-postgres/src/backend/sql/primaryKeys.js index bd0fb1b51..abc2ba9ec 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/sql/primaryKeys.js +++ b/plugins/dbgate-plugin-postgres/src/backend/sql/primaryKeys.js @@ -7,6 +7,7 @@ select key_column_usage.column_name as "column_name" from information_schema.table_constraints inner join information_schema.key_column_usage on table_constraints.table_name = key_column_usage.table_name and table_constraints.constraint_name = key_column_usage.constraint_name + and table_constraints.table_schema = key_column_usage.table_schema where table_constraints.table_schema !~ '^_timescaledb_' and table_constraints.constraint_type = 'PRIMARY KEY'