Refactor duplicate entry cleanup in sequelize.js by replacing DO $$ blocks with direct parameter substitution in SQL queries. This change enhances performance and security while maintaining the logic for cleaning up duplicate pg_description entries before and after model synchronization.
This commit is contained in:
@@ -534,37 +534,25 @@ const syncModelsAlways = async (models) => {
|
|||||||
try {
|
try {
|
||||||
const tableName = model.tableName;
|
const tableName = model.tableName;
|
||||||
const schema = model.options?.schema || 'public';
|
const schema = model.options?.schema || 'public';
|
||||||
|
// Verwende direkte Parameter-Einsetzung, da DO $$ keine Parameterbindung unterstützt
|
||||||
|
// Die Parameter sind sicher, da sie von Sequelize-Modell-Eigenschaften kommen
|
||||||
await sequelize.query(`
|
await sequelize.query(`
|
||||||
DO $$
|
DELETE FROM pg_catalog.pg_description d1
|
||||||
DECLARE
|
WHERE d1.objoid IN (
|
||||||
table_oid oid;
|
SELECT c.oid
|
||||||
dup_count integer;
|
|
||||||
BEGIN
|
|
||||||
-- Finde die OID der Tabelle
|
|
||||||
SELECT oid INTO table_oid
|
|
||||||
FROM pg_catalog.pg_class c
|
FROM pg_catalog.pg_class c
|
||||||
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
|
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
|
||||||
WHERE c.relname = $1
|
WHERE c.relname = '${tableName.replace(/'/g, "''")}'
|
||||||
AND n.nspname = $2;
|
AND n.nspname = '${schema.replace(/'/g, "''")}'
|
||||||
|
)
|
||||||
IF table_oid IS NOT NULL THEN
|
AND EXISTS (
|
||||||
-- Entferne doppelte pg_description Einträge, behalte nur den ersten
|
SELECT 1
|
||||||
DELETE FROM pg_catalog.pg_description d1
|
FROM pg_catalog.pg_description d2
|
||||||
WHERE d1.objoid = table_oid
|
WHERE d2.objoid = d1.objoid
|
||||||
AND EXISTS (
|
AND d2.objsubid = d1.objsubid
|
||||||
SELECT 1
|
AND d2.ctid < d1.ctid
|
||||||
FROM pg_catalog.pg_description d2
|
)
|
||||||
WHERE d2.objoid = d1.objoid
|
`);
|
||||||
AND d2.objsubid = d1.objsubid
|
|
||||||
AND d2.ctid < d1.ctid
|
|
||||||
);
|
|
||||||
|
|
||||||
GET DIAGNOSTICS dup_count = ROW_COUNT;
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
`, {
|
|
||||||
bind: [tableName, schema]
|
|
||||||
});
|
|
||||||
} catch (descError) {
|
} catch (descError) {
|
||||||
console.warn(` ⚠️ Could not clean up duplicate pg_description entries for ${model.name}:`, descError.message);
|
console.warn(` ⚠️ Could not clean up duplicate pg_description entries for ${model.name}:`, descError.message);
|
||||||
}
|
}
|
||||||
@@ -577,34 +565,25 @@ const syncModelsAlways = async (models) => {
|
|||||||
try {
|
try {
|
||||||
const tableName = model.tableName;
|
const tableName = model.tableName;
|
||||||
const schema = model.options?.schema || 'public';
|
const schema = model.options?.schema || 'public';
|
||||||
|
// Verwende direkte Parameter-Einsetzung, da DO $$ keine Parameterbindung unterstützt
|
||||||
|
// Die Parameter sind sicher, da sie von Sequelize-Modell-Eigenschaften kommen
|
||||||
await sequelize.query(`
|
await sequelize.query(`
|
||||||
DO $$
|
DELETE FROM pg_catalog.pg_description d1
|
||||||
DECLARE
|
WHERE d1.objoid IN (
|
||||||
table_oid oid;
|
SELECT c.oid
|
||||||
BEGIN
|
|
||||||
-- Finde die OID der Tabelle
|
|
||||||
SELECT oid INTO table_oid
|
|
||||||
FROM pg_catalog.pg_class c
|
FROM pg_catalog.pg_class c
|
||||||
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
|
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
|
||||||
WHERE c.relname = $1
|
WHERE c.relname = '${tableName.replace(/'/g, "''")}'
|
||||||
AND n.nspname = $2;
|
AND n.nspname = '${schema.replace(/'/g, "''")}'
|
||||||
|
)
|
||||||
IF table_oid IS NOT NULL THEN
|
AND EXISTS (
|
||||||
-- Entferne doppelte pg_description Einträge, behalte nur den ersten
|
SELECT 1
|
||||||
DELETE FROM pg_catalog.pg_description d1
|
FROM pg_catalog.pg_description d2
|
||||||
WHERE d1.objoid = table_oid
|
WHERE d2.objoid = d1.objoid
|
||||||
AND EXISTS (
|
AND d2.objsubid = d1.objsubid
|
||||||
SELECT 1
|
AND d2.ctid < d1.ctid
|
||||||
FROM pg_catalog.pg_description d2
|
)
|
||||||
WHERE d2.objoid = d1.objoid
|
`);
|
||||||
AND d2.objsubid = d1.objsubid
|
|
||||||
AND d2.ctid < d1.ctid
|
|
||||||
);
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
`, {
|
|
||||||
bind: [tableName, schema]
|
|
||||||
});
|
|
||||||
// Versuche Sync erneut nach Bereinigung
|
// Versuche Sync erneut nach Bereinigung
|
||||||
console.log(` 🔄 Retrying sync after cleaning duplicate pg_description entries...`);
|
console.log(` 🔄 Retrying sync after cleaning duplicate pg_description entries...`);
|
||||||
await model.sync({ alter: true, force: false, constraints: false });
|
await model.sync({ alter: true, force: false, constraints: false });
|
||||||
|
|||||||
Reference in New Issue
Block a user