Je me retrouve chaque semaine à apprendre une ou plusieurs nouvelles choses, du moins du point de vue de ma propre expérience personnelle. J'ai donc pensé que le partager ici serait un bon moyen de consolider certaines de ces connaissances, d'en garder une trace et potentiellement d'aider quelqu'un d'autre à apprendre quelque chose qu'il ne savait pas auparavant.
Cette semaine, j'ai appris qu'il est possible d'écrire un script Python capable de prendre une liste de noms de sauvegarde de base de données, d'importer une base de données dans MySQL, puis de démarrer un contexte Flask et d'exécuter un rapport sur la base de données telle qu'elle est, et puis rincez et répétez.
Cela semble peut-être être un concept simple, mais essayer d'y parvenir en utilisant une approche essentiellement standard s'est avéré être un défi trompeur. J'ai commencé par simplement écrire un script qui importait la sauvegarde, puis j'ai exécuté le rapport sur les données importées et je l'ai mis en boucle. Mais malheureusement, j'ai rencontré un terminal qui s'est bloqué lors de la 2ème itération de la boucle, et j'ai donc commencé à comprendre ce qui pourrait se passer.
La première pensée qui m'est venue à l'esprit était que les importations que je faisais depuis l'application Flask provoquaient le blocage de l'importation puisque le script n'était pas encore terminé, donc le verrou maintenant la connexion à la base de données avec Flask était toujours actif. , mais il n'y a eu aucun message d'erreur pour m'informer que cela se produisait, et je suppose que c'est intentionnel, j'ai donc utilisé mon expérience avec Flask pour rationaliser que c'était très probablement le cas.
Alors, je suis allé chercher comment simplement « désimporter » les modules que j'avais importés de Flask et je suis tombé sur le mot-clé del en python pour faire le travail et j'ai réessayé... Seulement pour rencontrer le même terminal suspendu avec lequel je m'étais assis précédemment. C’était donc de retour à la planche à dessin.
La pensée suivante que j'ai eue était qu'il se peut que les modules aient été supprimés, mais que le contexte de l'application Flask est toujours en cours d'exécution quelque part. Pour forcer le contexte de l'application Flask à s'exécuter et à s'arrêter là où je le voulais, j'ai essayé une approche que j'avais utilisée dans une tâche précédente il y a environ 2 ans où je devais utiliser le contexte de l'application Flask pour envoyer des e-mails de manière asynchrone.
J'ai ensuite essayé d'importer l'application à partir de la boucle for, puis d'utiliser la commande with app.app_context(): pour forcer Flask à démarrer et à s'arrêter uniquement dans ce contexte spécifié. J'ai ensuite exécuté le script et regardé le terminal en retenant mon souffle pendant que j'attendais environ une minute pour que la base de données soit importée dans la première boucle, puis elle a commencé avec la 2ème comme avant, et puis, succès ! La deuxième importation a fonctionné et j'ai obtenu le résultat attendu de l'étape suivante indiquant que le rapport avait été terminé, ce que j'ai vérifié par rapport au fichier de sortie.
J'étais satisfait de mes résultats car ce n'était pas quelque chose que j'avais fait auparavant, donc j'étais heureux de pouvoir le comprendre et le faire fonctionner comme prévu.
Vous vous demandez peut-être pourquoi j'essayais de faire ça en premier lieu, et bien, c'est une bonne question. J'avais pour tâche d'extraire un rapport mensuel historique nécessitant des données qui n'avaient été enregistrées nulle part ailleurs que dans les sauvegardes de la base de données, et qui ne pouvaient pas être collectées à partir de la base de données active actuelle. Je n'avais donc que des sauvegardes avec lesquelles travailler pour extraire ces données. . C'est ce qui m'a amené à apprendre comment gérer le contexte Flask parallèlement aux importations de bases de données.
Pour ceux qui aiment lire un peu de code, voici comment j'ai structuré mon script :
import os # for running the database import command backup_name_list = [ "backup1", "backup2" ] for backup_name in backup_name_list: # do all necessary changes or checks on the db name here command = f"mysql -u db_user_name --password='SomePassword' db_name < '/path/to/{backup_name}.sql'" os.command(command) # import the app variable to allow for the context to be created from app_module import app_variable with app_variable.app_context(): # do all Flask related imports here from app_module import relevant_app_class_or_function # run all relevant code here to build up your data from the loaded backup # remove the imported modules del relevant_app_class_or_function # remove the app variable after the context expires just to be safe del app_variable
Et voilà, c'est ainsi que j'ai pu extraire des données historiques à partir uniquement des sauvegardes de bases de données.
Ceci est très spécifique, et je m'en rends compte, mais ce n'est pas non plus un tutoriel, c'est simplement un exutoire pour mon expérience d'apprentissage personnelle, que j'aimerais partager ici dans l'espoir que cela devienne soit une lecture intéressante, soit un conseil utile à quelqu'un, quelque part là-bas.
Si vous êtes arrivé jusqu'ici, je voudrais vous remercier d'avoir lu et j'espère que vous me rejoindrez dans mon prochain message.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!