今週学んだこと #0

PHPz
リリース: 2024-07-25 22:54:53
オリジナル
790 人が閲覧しました

What I

少なくとも私自身の個人的な経験の観点から、私は毎週 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 < '/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

ログイン後にコピー

これで、データベースのバックアップのみから履歴データを取得することができました。

これは非常に具体的であり、それは承知していますが、これはチュートリアルでもありません。純粋に私の個人的な学習経験の出口であり、興味深い読み物になることを願って、ここで共有したいと思います。どこかの誰かに役立つヒント。

ここまで読んでいただいた方には、読んでいただきありがとうございます。次回の投稿にもお付き合いいただければ幸いです。

以上が今週学んだこと #0の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!