-- Baseline: archivierte Sequelize-Migrationen als „bereits ausgeführt“ markieren -- --------------------------------------------------------------------------- -- Kontext: Ab diesem Stand nutzt `npm run db:migrate` nur noch `migrations-active/`. -- Die bisherigen Dateien liegen unter `migrations-archive/` und werden nicht mehr -- vom CLI ausgeführt. In bestehenden Datenbanken sind viele Einträge in -- "SequelizeMeta" schon vorhanden; fehlende werden hier ergänzt. -- -- Wann: Einmal VOR dem ersten Deploy ausführen, der nur noch `migrations-active` -- verwendet (oder direkt nach dem Ausrollen dieses Commits, bevor/neben -- dem nächsten `db:migrate`). -- -- Idempotent: Bereits vorhandene Namen werden übersprungen (WHERE NOT EXISTS). -- -- Nicht für leere/neue Datenbanken: Dort das Schema über die archivierten -- Migrationen oder euren üblichen Init-Weg aufbauen – diese Baseline ersetzt -- keine fehlenden DDL-Schritte. -- -- Wo liegt SequelizeMeta? -- Gleiche PostgreSQL-Datenbank wie das Backend (DB_NAME), in der Regel Schema -- `public`. Sequelize/sequelize-cli legen die Tabelle beim ersten Lauf von -- `db:migrate` an. Fehlt sie, bist du oft in der falschen DB verbunden oder -- es lief noch nie eine Migration gegen diese DB. -- Prüfen: SELECT schemaname, tablename FROM pg_tables -- WHERE tablename IN ('SequelizeMeta','sequelizemeta'); CREATE TABLE IF NOT EXISTS "SequelizeMeta" ( name VARCHAR(255) NOT NULL PRIMARY KEY ); INSERT INTO "SequelizeMeta" (name) SELECT v.name FROM (VALUES ('20240913071145-add-answer-fields-to-contact_message.cjs'), ('20251126120000-add-last-nobility-advance-to-falukant-user.cjs'), ('20251208000000-add-character-name-to-notification.cjs'), ('20251216000000-add-weather-type-to-production.cjs'), ('20251216000100-add-product-quality-to-stock.cjs'), ('20251220000000-add-reputation-to-character.cjs'), ('20251220001000-add-reputation-actions.cjs'), ('20251220002000-backfill-reputation-action-window.cjs'), ('20251220003000-seed-reputation-actions.cjs'), ('20251222000000-fix-vehicle-condition-null.cjs'), ('20251222001000-add-may-repair-vehicles-to-director.cjs'), ('20251230000000-add-vocab-trainer-tables.cjs'), ('20251230001000-add-vocab-chapters-and-lexemes.cjs'), ('20260101000000-add-tax-percent-to-region.cjs'), ('20260101000002-add-neutral-sell-costs-to-product.cjs'), ('20260115000000-add-vocab-courses.cjs'), ('20260115000001-add-vocab-grammar-exercises.cjs'), ('20260115000002-add-course-structure.cjs'), ('20260115000003-add-course-learning-goals.cjs'), ('20260118000000-add-notification-user-shown-index.cjs'), ('20260320000000-add-relationship-state-and-child-legitimacy.cjs'), ('20260320001000-backfill-relationship-state.cjs'), ('20260320002000-add-servants-to-user-house.cjs'), ('20260323000000-add-household-tension-to-user-house.cjs'), ('20260323010000-expand-debtors-prism.cjs'), ('20260323020000-add-transport-guards-and-raid-underground.cjs'), ('20260325000000-add-vocab-lesson-didactics.cjs'), ('20260325010000-expand-user-param-value-to-text.cjs'), ('20260326000000-add-adult-area-to-gallery.cjs'), ('20260326001000-create-erotic-video.cjs'), ('20260326002000-add-is-adult-only-to-chat-room.cjs'), ('20260326003000-add-adult-content-moderation.cjs'), ('20260327000000-add-erotic-video-visibility.cjs'), ('20260330000000-add-character-pregnancy.cjs'), ('20260331000000-add-vocab-lesson-phase1-fields.cjs'), ('20260401000000-add-vocab-course-progress-lesson-state.cjs'), ('20260401120000-politics-benefits-and-daily-salary.cjs'), ('20260402120000-add-ui-locale-fr-user-param-value.cjs'), ('20260402140000-add-certificate-productions-count-since.cjs'), ('20260402180000-political-benefits-mechanics.cjs'), ('20260403120000-political-office-hierarchy-level.cjs'), ('20260413152500-add-relationship-state-scandal-extra-daily-pct.cjs'), ('20260413190000-add-relationship-state-marriage-satisfaction-column.cjs'), ('20260417000000-add-vocab-srs-item.cjs'), ('add_trigger_for_hashedId.cjs') ) AS v(name) WHERE NOT EXISTS ( SELECT 1 FROM "SequelizeMeta" m WHERE m.name = v.name );