少なくとも私自身の個人的な経験の観点から言えば、私は毎週 1 つ以上の新しいことを学んでいます。そこで、ここで共有することは、その知識の一部を固め、記録を残し、他の人がこれまで知らなかったことを学ぶのに役立つ可能性がある良い方法であると考えました。
今週、データベースのバックアップ名のリストを取得し、データベースを MySQL にインポートし、Flask コンテキストを起動して、現状のデータベースでレポートを実行できる Python スクリプトを作成できることを学びました。その後、すすいで繰り返します。
これは単純な概念のように聞こえるかもしれませんが、ほぼ標準的なアプローチを使用してこれを達成しようとすると、一見すると難しいことがわかりました。まず、バックアップをインポートするスクリプトを単純に作成し、インポートされたデータに対してレポートを実行し、それをループに組み込みました。しかし、悲しいことに、ループの 2 回目の反復で端末がハングすることに遭遇したため、何が起こっているのかを分析し始めました。
最初に頭に浮かんだのは、スクリプトがまだ終了していないため、Flask アプリから行っていたインポートによってインポートがブロックされ、Flask とのデータベース接続を保持しているロックがまだアクティブになっていたのではないかということでした。 , しかし、これが起こっていることを知らせるエラー メッセージはありませんでした。これは仕様によるものだと思うので、Flask での経験を利用して、これが当てはまる可能性が最も高いと合理的に説明しました。
そこで、Flask からインポートしたモジュールを単純に「インポート解除」する方法を探し、Python で del キーワードを見つけて作業を完了し、再試行しました...以前に座っていたのと同じ吊り下げられた端末です。それで、振り出しに戻りました。
次に私が考えたのは、モジュールは削除されたものの、Flask アプリのコンテキストはまだどこかで実行されているのではないかということでした。 Flask アプリ コンテキストを強制的に実行し、希望する場所で停止するために、Flask アプリ コンテキストを使用してメールを非同期に送信する必要がある、約 2 年前の以前のタスクで使用したアプローチを試しました。
次に、for ループ内からアプリをインポートしてから、 with app.app_context(): コマンドを使用して、この指定されたコンテキスト内でのみ Flask の起動と停止を強制してみました。それからスクリプトを実行し、最初のループでデータベースがインポートされるまで 1 分ほど待ってターミナルを固唾を飲んで見守り、その後、以前と同じように 2 番目のループからインポートが開始され、成功しました。 2 回目のインポートは機能し、レポートが完了したことを示す期待どおりの次のステップの出力が得られました。これを出力ファイルと照合して確認しました。
これは今までにやったことがなかったため、結果に満足しました。そのため、それを理解して期待どおりに動作させることができて嬉しかったです。
そもそもなぜこれをやろうとしたのか疑問に思っているかもしれませんが、それは良い質問です。私は履歴月次レポートを取得する任務を負っていましたが、そのデータにはデータベースのバックアップ以外の場所に保存されておらず、現在のライブ データベースからは収集できないデータが必要でした。そのため、このデータを取得するために使用できるのはバックアップだけでした。 。これが、データベースのインポートと並行して 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