Robert-2 / Robert2

Application web de gestion de parc de matériel destiné à la location ou au prêt
https://robertmanager.org
Other
42 stars 14 forks source link

Problème lors de la migration de la base de données 0.21.2 vers 0.22 #393

Closed corentindrd closed 1 year ago

corentindrd commented 1 year ago

Bonjour,

En voulant installer la nouvelle version 0.22 j'ai eu cette erreur lors du moment ou l'assistant d'installation met a jour la BDD pour la nouvelle version.

using migration paths 
 - /var/www/robert2/src/migrations
using seed paths 
using environment production
using database robert2
using table prefix 
ordering by creation time

 == 20230517234638 ImproveEventMaterials: migrating 
Exception: The `event_materials` table contains some duplicate (event_id / material_id) that are not fixable automatically. Please see the app logs for details. in /var/www/robert2/src/migrations/20230517234638_improve_event_materials.php:100
Stack trace:
#0 /var/www/robert2/vendors/robmorgan/phinx/src/Phinx/Migration/Manager/Environment.php(111): ImproveEventMaterials->up()
#1 /var/www/robert2/vendors/robmorgan/phinx/src/Phinx/Migration/Manager.php(388): Phinx\Migration\Manager\Environment->executeMigration()
#2 /var/www/robert2/vendors/robmorgan/phinx/src/Phinx/Migration/Manager.php(359): Phinx\Migration\Manager->executeMigration()
#3 /var/www/robert2/vendors/robmorgan/phinx/src/Phinx/Console/Command/Migrate.php(122): Phinx\Migration\Manager->migrate()
#4 /var/www/robert2/src/App/Console/Command/Migrations/ConfigurationTrait.php(67): Phinx\Console\Command\Migrate->execute()
#5 /var/www/robert2/vendors/symfony/console/Command/Command.php(291): Loxya\Console\Command\Migrations\MigrateCommand->execute()
#6 /var/www/robert2/vendors/symfony/console/Application.php(1014): Symfony\Component\Console\Command\Command->run()
#7 /var/www/robert2/src/App/Console/App.php(63): Symfony\Component\Console\Application->doRunCommand()
#8 /var/www/robert2/vendors/symfony/console/Application.php(301): Loxya\Console\App->doRunCommand()
#9 /var/www/robert2/src/App/Console/App.php(49): Symfony\Component\Console\Application->doRun()
#10 /var/www/robert2/src/install/Install.php(170): Loxya\Console\App->doRun()
#11 /var/www/robert2/src/install/Install.php(119): Loxya\Install\Install::_executePhinxCommand()
#12 /var/www/robert2/src/App/Controllers/SetupController.php(97): Loxya\Install\Install::migrateDatabase()
#13 /var/www/robert2/vendors/slim/slim/Slim/Handlers/Strategies/RequestResponse.php(38): Loxya\Controllers\SetupController->index()
#14 /var/www/robert2/vendors/slim/slim/Slim/Routing/Route.php(358): Slim\Handlers\Strategies\RequestResponse->__invoke()
#15 /var/www/robert2/vendors/slim/slim/Slim/MiddlewareDispatcher.php(65): Slim\Routing\Route->handle()
#16 /var/www/robert2/vendors/slim/slim/Slim/MiddlewareDispatcher.php(65): Slim\MiddlewareDispatcher->handle()
#17 /var/www/robert2/vendors/slim/slim/Slim/Routing/Route.php(315): Slim\MiddlewareDispatcher->handle()
#18 /var/www/robert2/vendors/slim/slim/Slim/Routing/RouteRunner.php(68): Slim\Routing\Route->run()
#19 /var/www/robert2/src/App/Middlewares/BodyParser.php(62): Slim\Routing\RouteRunner->handle()
#20 /var/www/robert2/vendors/slim/slim/Slim/MiddlewareDispatcher.php(121): Loxya\Middlewares\BodyParser->process()
#21 /var/www/robert2/src/App/Middlewares/Acl.php(35): Psr\Http\Server\RequestHandlerInterface@anonymous->handle()
#22 /var/www/robert2/vendors/slim/slim/Slim/MiddlewareDispatcher.php(269): Loxya\Middlewares\Acl->__invoke()
#23 /var/www/robert2/src/App/Services/Auth.php(36): Psr\Http\Server\RequestHandlerInterface@anonymous->handle()
#24 /var/www/robert2/vendors/slim/slim/Slim/MiddlewareDispatcher.php(269): Loxya\Services\Auth->middleware()
#25 /var/www/robert2/src/App/Middlewares/Pagination.php(20): Psr\Http\Server\RequestHandlerInterface@anonymous->handle()
#26 /var/www/robert2/vendors/slim/slim/Slim/MiddlewareDispatcher.php(269): Loxya\Middlewares\Pagination->__invoke()
#27 /var/www/robert2/vendors/slim/slim/Slim/Middleware/RoutingMiddleware.php(45): Psr\Http\Server\RequestHandlerInterface@anonymous->handle()
#28 /var/www/robert2/vendors/slim/slim/Slim/MiddlewareDispatcher.php(121): Slim\Middleware\RoutingMiddleware->process()
#29 /var/www/robert2/vendors/slim/slim/Slim/Middleware/ErrorMiddleware.php(76): Psr\Http\Server\RequestHandlerInterface@anonymous->handle()
#30 /var/www/robert2/vendors/slim/slim/Slim/MiddlewareDispatcher.php(121): Slim\Middleware\ErrorMiddleware->process()
#31 /var/www/robert2/vendors/slim/http-cache/src/Cache.php(67): Psr\Http\Server\RequestHandlerInterface@anonymous->handle()
#32 /var/www/robert2/vendors/slim/slim/Slim/MiddlewareDispatcher.php(121): Slim\HttpCache\Cache->process()
#33 /var/www/robert2/vendors/slim/slim/Slim/MiddlewareDispatcher.php(65): Psr\Http\Server\RequestHandlerInterface@anonymous->handle()
#34 /var/www/robert2/vendors/slim/slim/Slim/App.php(199): Slim\MiddlewareDispatcher->handle()
#35 /var/www/robert2/vendors/slim/slim/Slim/App.php(183): Slim\App->handle()
#36 /var/www/robert2/src/App/App.php(54): Slim\App->run()
#37 /var/www/robert2/src/public/index.php(17): Loxya\App->run()
#38 {main}

Le problème vient il de mon coté, si oui comment faire pour le résoudre ?

Donov4n commented 1 year ago

Bonjour @corentindrd,

Comme indiqué dans le message, votre table contenant le matériel des événements contient certains doublons et le système ne peut pas choisir de lui-même quels sont ceux qui sont à garder et ceux à supprimer (car, probablement que pour un matériel donné, dans certains événements, vous avez spécifié deux quantités différentes et le système ne sait pas quelle quantité choisir entre les deux).

Ce problème doit être corrigé manuellement avant de procéder à la mise à jour de la base de données.
Ces vérifications supplémentaires ont été ajoutées dans la 0.22 car de nouveaux moyens d'empêcher ces doublons ont été ajoutés (ils ne pourront plus se produire à l'avenir) mais en attendant il faut malheureusement corriger ceux existants, quand il y en a, et il s'avère que c'est le cas pour vous.

Le fichier de log de votre application devrait contenir plus de détails sur les doublons en question, vous pouvez trouver les fichiers de log dans le dossier src/var/logs.

La résolution du problème consiste à vérifier votre base données dans son état d'avant mise à jour, à la recherche de doublons de matériel pour un même événement et de ne garder que la ligne qui correspond à la quantité souhaitée, et ceci pour chaque matériel qui apparait plusieurs fois dans un même événement. (assurez-vous de toujours conserver une copie de l'ancienne base de données avant d'entreprendre de modifications)

Vous pouvez essayer de trouver les doublons dans votre table event_materials via la commande suivante :

SELECT t1.* 
FROM `event_materials` t1 
INNER JOIN (
    SELECT event_id, material_id 
    FROM `event_materials` 
    GROUP BY event_id, material_id 
    HAVING COUNT(*) > 1
) t2
ON t1.event_id = t2.event_id
AND t1.material_id = t2.material_id;

Cela vous affichera TOUTES les lignes qui apparaissent plusieurs fois.
Il s'agira donc de ne garder que celles qui sont valides (= Il faut garder une ligne par paire event_id + material_id).

NOTE: Si vous avez besoin d'aide pour faire ces manipulations à votre place, vous pouvez, si vous le souhaitez, passer par un rendez-vous de support (payant) via ce lien.

corentindrd commented 1 year ago

Merci pour le retour, tout est fonctionnel.

Bravo et bon courage