Gladys V4 - Affichage de capteurs dans l'interface

@bertrandda malheureusement ta solution ne fonctionne pas à 100%, en fait tu as mis le doigt sur un bug (ou une feature^^) de sequelize!

En SQlite ALTER TABLE n’existe pas. La seule façon de mettre à jour une table est de la renommer, de la recréer et de migrer les données.

Sequelize a abstrait cette partie, et fait ça quand tu fais ton changeColumn:

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`;

Or, si tu lis bien le code, il y a un bug dans cette implémentation: les foreign key + les contraints ne sont pas migrées. Donc oui, ton name n’a plus de contraintes: mais toutes les autres columns ont aussi perdu leurs contraintes aussi, et la table se retrouve sans aucunes protections. Le selector n’est plus unique, les foreign keys ont sautés, etc…

Cf code :

Après fouille du GitHub de Sequelize, il y a une issue créé en 2017 qui référence le problème:

Mais visiblement le bug n’est toujours pas résolu…

Trois options:

  • On utilise un “hack” qui considère à override une des fonctions de Sequelize lors de cette migration pour re-rajouter les contraintes.
  • On trouve un moyen de fixer Sequelize et on propose une PR (après pas sur que ça soit mergé avant qu’on en ait besoin)
  • On oublie de faire un changeColumn et on demande aux gens de re-créer la DB… ce qui fixe à court terme, mais bon si à long terme on veut changer une column le problème est toujours là !