J'ai eu exactement le même problème que le vôtre. J'ai implémenté un script de surveillance à l'aide de la bibliothèque de chiens de garde et, à la fin de "wait_timeout", une erreur MySQL serait générée.
Après quelques essais avec la fonction "django.db.close_old_connections()", cela ne fonctionnait toujours pas, mais j'essayais de fermer les anciennes connexions à chaque intervalle de temps défini, ce qui ne fonctionnait pas. J'ai changé la commande de fermeture pour qu'elle s'exécute uniquement avant l'appel de ma commande de gestion personnalisée (qui est la commande qui interagira avec db et utilisée pour planter avec l'erreur MySQL) et cela a commencé à fonctionner.
Apparemment de cette page , la raison pour laquelle cela se produit est que la fonction "close_old_connection" est liée uniquement aux signaux de requête HTTP, elle ne sera donc pas déclenchée dans des scripts personnalisés spécifiques. La documentation de Django ne dit pas cela, et honnêtement, j'ai aussi compris les choses de la même manière que vous compreniez.
Donc, ce que vous pouvez essayer de faire est d'ajouter l'appel pour fermer l'ancienne connexion avant d'interagir avec db :
from django.db import close_old_connections
close_old_connections()
do_something_with_db()