Migration Analyze (V2) — Analyzer “Models / Migrations / DB” + prescriptions
Objectif : arrêter la “pêche aux infos” en cas de migrations Django infernales. Ce cron croise : Data Model Django + plan de migrations + schéma réel SQL (MySQL/MariaDB, PostgreSQL, SQLite), puis sort : risques, diagnostic, et surtout des actions recommandées.
- Plan : liste des opérations de migrations (forward) pour avoir la trajectoire.
- Risks : détecte les erreurs probables (1061 / 1071, index TEXT/BLOB, colonnes manquantes).
- Recommendations : propose “quoi faire” (FAKE migration vs DROP index, etc.).
- Auto-fix (optionnel) : peut DROP les index en conflit (mode dev/staging).
- Export JSON : idéal pour un dashboard IDEO-Lab (findings + actions + fixes appliqués).
MYSQL_1061_RISK→ index existe déjà : FAKE si identique, sinon DROP.MYSQL_1071_RISK→ clé trop longue : propose max_length=191, réduire composite, ou prefix index via RunSQL.MYSQL_INDEX_SIZE_UNKNOWN→ table/colonne pas encore migrée (INFO) vs vrai risque TEXT/BLOB (WARN).
Étape 1 — Installation du Cron / Management Command
1) Où placer le fichier Python
Place la commande dans une app utilitaire (ex : toolbox, accounts, tools), ou directement dans l’app qui “porte” tes outils de maintenance.
your_project/
toolbox/ # ou accounts/, tools/...
management/
__init__.py
commands/
__init__.py
migration_analyze.py # <= le cron V2__init__.py dans management/ et commands/, sinon Django ne détectera pas la commande.2) Copier le fichier migration_analyze.py (V2)
Tu peux copier-coller ta version V2 (celle qu’on vient de valider). :contentReference[oaicite:2]{index=2} Si tu veux proposer un download dans IDEO-Lab, place aussi une copie sous static/.
# (colle ici le contenu du fichier V2 — voir migration_analyze.py V2)
# Référence : :contentReference[oaicite:3]{index=3}3) Vérifier que l’app est bien dans INSTALLED_APPS
INSTALLED_APPS = [
# ...
"toolbox", # ou l'app qui contient management/commands/migration_analyze.py
]4) Test de présence de la commande
python manage.py help | findstr migration_analyze
python manage.py migration_analyze --help--help, c’est OK : Django l’a détectée.Étape 2 — Utilisation au quotidien
A) Diagnostic rapide (plan / diff / risks)
# Affiche les opérations forward (résumé)
python manage.py migration_analyze --plan# Détecte tables "orphelines" / manquantes (heuristique)
python manage.py migration_analyze --diff# Ton cas: MariaDB avec limite de clé = 1000
python manage.py migration_analyze --risks --mysql-max-key-bytes 1000 --verboseB) Cibler une app uniquement
# Exemple : on ne regarde que l’app "weglot"
python manage.py migration_analyze --risks --apps weglot --mysql-max-key-bytes 1000C) Export JSON (pour dashboard IDEO-Lab)
python manage.py migration_analyze --risks --mysql-max-key-bytes 1000 --export-json migration_report.jsonfindings, recommendations et fixes_applied. C’est parfait pour ton pattern “Analyzer IDEO-Lab” (cards + détails + actions).Étape 3 — Auto-Fix & Sécurité
- Autorisé : dev / staging / environnements de test.
- Déconseillé : production (sauf procédure contrôlée + backup + maintenance window).
A) Auto-fix des 1061 (dry-run d’abord)
# Affiche le DROP proposé, sans exécuter
python manage.py migration_analyze --risks --fix-1061 drop --dry-run --emit-sqlB) Auto-fix des 1061 (exécution)
# Applique DROP INDEX automatiquement, puis tu relances migrate
python manage.py migration_analyze --risks --fix-1061 drop --emit-sql
python manage.py migrateC) Mode “safe” : suggestion de FAKE
Si l’index DB est déjà identique à l’index prévu, la V2 te propose plutôt : faker la migration (aligner l’historique) plutôt que drop/recreate.
# N'applique rien: affiche une commande "migrate ... --fake" suggérée
python manage.py migration_analyze --risks --fix-1061 fakeFAQ / Dépannage
1) “Model was already registered / Reloading models is not advised”
- évite de lancer la commande dans un contexte “reload” (runserver autoreload, certains IDE)
- lance depuis un terminal propre
- vérifie les imports (pas de double import de module)
2) “MYSQL_INDEX_SIZE_UNKNOWN”
- INFO (TABLE/COLUMN missing) : normal si la table n’est pas encore migrée.
- WARN (TEXT/BLOB) : risque réel → re-design (CharField) ou prefix index via RunSQL.
3) “MYSQL_1071_RISK key too long” (MariaDB)
- CharField trop long dans un index composite (utf8mb4 ≈ 4 bytes/char).
- index sur plusieurs champs varchar(255).
- réduire
max_lengthdes champs indexés à 191 - réduire le nombre de colonnes dans l’index composite
4) “Je veux l’intégrer dans un pipeline / cron”
Voir la modal “Intégration Cron”.
