Каждую неделю я узнаю одну или несколько новых вещей, по крайней мере, с точки зрения моего личного опыта. Итак, я подумал, что поделиться ими здесь будет хорошим способом закрепить некоторые из этих знаний, вести их учет и потенциально помочь кому-то еще узнать что-то, чего они раньше не знали.
На этой неделе я узнал, что можно написать скрипт Python, который может принимать список имен резервных копий базы данных, импортировать базу данных в MySQL, затем запускать контекст Flask и запускать отчет по базе данных в ее нынешнем виде, и затем промойте и повторите.
Может быть, это звучит как простая концепция, но попытка добиться этого, используя в основном стандартный подход, оказалась обманчиво сложной задачей. Я начал с простого написания сценария, который импортировал резервную копию, затем запускал отчет по импортированным данным и помещал его в цикл. Но, к сожалению, я столкнулся с терминалом, который зависал на второй итерации цикла, и поэтому я начал разбираться в том, что может произойти.
Первая мысль, которая пришла на ум, заключалась в том, что импорт, который я делал из приложения Flask, приводил к блокировке импорта, поскольку сценарий еще не завершился, поэтому блокировка, удерживающая соединение с базой данных с Flask, все еще была активна. , но не было никакого сообщения об ошибке, сообщающего мне, что это происходит, и я предполагаю, что это задумано, поэтому я использовал свой опыт работы с Flask, чтобы объяснить, что это, скорее всего, так и есть.
Итак, я пошел искать, как просто «отменить импорт» модулей, которые я импортировал из Flask, и наткнулся на ключевое слово del в Python, чтобы выполнить работу, и попробовал еще раз... Только чтобы встретить тот же подвесной терминал, с которым я сидел раньше. Итак, мы вернулись к чертежной доске.
Следующая мысль, которая у меня возникла, заключалась в том, что, возможно, модули были удалены, но контекст приложения Flask все еще где-то работает. Чтобы заставить контекст приложения Flask запускаться и останавливаться там, где я хотел, я попробовал подход, который я использовал в предыдущей задаче около 2 лет назад, когда мне нужно было использовать контекст приложения Flask для асинхронной отправки электронных писем.
Затем я попытался импортировать приложение из цикла for, а затем использовать команду with app.app_context():, чтобы заставить Flask запускаться и останавливаться только в этом указанном контексте. Затем я запустил сценарий и, затаив дыхание, наблюдал за терминалом, пока ждал минуту или около того, пока база данных импортировалась в первом цикле, затем все началось со второго, как и раньше, и затем успех! Второй импорт сработал, и я получил ожидаемый результат следующего шага, указывающий, что отчет был завершен, что я сверил с выходным файлом.
Я был доволен своими результатами, так как раньше я такого не делал, поэтому я был рад, что смог разобраться и заставить это работать так, как ожидалось.
Возможно, вам интересно, почему я вообще пытался это сделать, и это хороший вопрос. Мне было поручено получить исторический ежемесячный отчет, для которого требовались данные, которые не были сохранены нигде, кроме резервных копий базы данных, и которые нельзя было собрать из текущей действующей базы данных, поэтому у меня были только резервные копии, с которыми я мог работать, чтобы получить эти данные. . Именно это привело меня к изучению того, как управлять контекстом Flask наряду с импортом базы данных.
Для тех, кто любит читать код, я структурировал свой скрипт следующим образом:
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И все, именно так я смог извлечь исторические данные только из резервных копий базы данных.
Это очень специфично, и я это понимаю, но это также не учебное пособие, а просто выражение моего личного опыта обучения, которым я хотел бы поделиться здесь в надежде, что оно станет либо интересным чтением, либо полезным. полезный совет кому-то где-то там.
Если вы дочитали до этого момента, я хотел бы поблагодарить вас за чтение и надеюсь, что вы присоединитесь ко мне в моем следующем посте.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3