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:
Torsten Schulz (local)
2025-12-19 07:53:34 +01:00
parent 091b9ff70a
commit 642e215c69

View File

@@ -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 });