@bertrandda leider funktioniert deine Lösung nicht zu 100 %, tatsächlich hast du einen Bug (oder ein Feature^^) von Sequelize entdeckt!
In SQLite gibt es kein ALTER TABLE. Die einzige Möglichkeit, eine Tabelle zu aktualisieren, besteht darin, sie umzubenennen, neu zu erstellen und die Daten zu migrieren.
Sequelize hat diesen Teil abstrahiert und tut dies, wenn du changeColumn ausführst:
Executing (default): PRAGMA TABLE_INFO(`t_device`);
Executing (default): CREATE TABLE IF NOT EXISTS `t_device_backup` (`id` UUID NOT NULL PRIMARY KEY, `service_id` UUID NOT NULL, `room_id` UUID, `name` VARCHAR(255) NOT NULL, `selector` VARCHAR(255) NOT NULL, `model` VARCHAR(255), `external_id` VARCHAR(255) NOT NULL, `should_poll` TINYINT(1) NOT NULL DEFAULT 0, `poll_frequency` INTEGER, `created_at` DATETIME NOT NULL, `updated_at` DATETIME NOT NULL);
Executing (default): INSERT INTO `t_device_backup` SELECT `id`, `service_id`, `room_id`, `name`, `selector`, `model`, `external_id`, `should_poll`, `poll_frequency`, `created_at`, `updated_at` FROM `t_device`;
Executing (default): DROP TABLE `t_device`;
Executing (default): CREATE TABLE IF NOT EXISTS `t_device` (`id` UUID NOT NULL PRIMARY KEY, `service_id` UUID NOT NULL, `room_id` UUID, `name` VARCHAR(255) NOT NULL, `selector` VARCHAR(255) NOT NULL, `model` VARCHAR(255), `external_id` VARCHAR(255) NOT NULL, `should_poll` TINYINT(1) NOT NULL DEFAULT 0, `poll_frequency` INTEGER, `created_at` DATETIME NOT NULL, `updated_at` DATETIME NOT NULL);
Executing (default): INSERT INTO `t_device` SELECT `id`, `service_id`, `room_id`, `name`, `selector`, `model`, `external_id`, `should_poll`, `poll_frequency`, `created_at`, `updated_at` FROM `t_device_backup`;
Executing (default): DROP TABLE `t_device_backup`;
Oder, wenn du den Code genau liest, gibt es einen Bug in dieser Implementierung: Die Foreign Keys und Constraints werden nicht migriert. Daher hat dein Name keine Constraints mehr: aber alle anderen Spalten haben ihre Constraints ebenfalls verloren, und die Tabelle hat keinen Schutz mehr. Der Selector ist nicht mehr eindeutig, die Foreign Keys sind weg, usw.
Siehe Code:
Nach einer Suche im Sequelize-GitHub gibt es ein Issue, das 2017 erstellt wurde und das Problem referenziert:
Aber anscheinend ist der Bug immer noch nicht behoben..
Drei Optionen:
- Wir verwenden einen „Hack“, der eine der Funktionen von Sequelize während dieser Migration überschreibt, um die Constraints wieder hinzuzufügen.
- Wir finden einen Weg, Sequelize zu beheben, und schlagen einen PR vor (allerdings bin ich mir nicht sicher, ob er vor unserem Bedarf gemerged wird)
- Wir vergessen, changeColumn zu verwenden, und bitten die Leute, die DB neu zu erstellen… was kurzfristig löst, aber wenn wir langfristig eine Spalte ändern wollen, ist das Problem immer noch da!