こんにちは。
めちゃめちゃ久しぶりの更新になってしまったのですが今回は、pythonライブラリstreamlitを使っていて戸惑ったことの備忘録です。誰得?と思うくらいニッチなことですが、誰か一人のために参考になってたら嬉しいです。
データベースが反映されない
以前、streamlitでボートレースの予想データを作った回があるのですが、
これをデータ更新するのに新しいデータ、更新したデータが反映されないというトラブルに見舞われました。
streamlitはgithubのリポジトリを読み込んで、アプリを作る仕様なのですが、データの更新(ローカル環境でデータベースの更新→githubに更新したデータベースをデプロイ)をしても、streamlit上では古いデータの情報が反映されているというものです。
解決した方法
streamlitの公式サイトを見てもよくわからなかった(ちゃんと探せば該当箇所があるかもしれないが)ので、AI先生に聞いてみるとこんな提案が2つありました。
- 提案1. GitHubのデータベースを定期的に取得するようにする
- Streamlitアプリが起動するたびに、最新のデータベースファイルをGitHubから取得するように設定します。これにより、常に最新のデータベース情報が反映されます。
- 提案2. Streamlitアプリのキャッシュを無効にする
- Streamlitはデフォルトでキャッシュを使用して、データの読み込みを高速化します。しかし、キャッシュが原因で最新のデータが反映されない場合があります。これを防ぐために、データベースの読み込み関数にキャッシュを使用しないよう設定することができます。
これを私なりに解釈すると、高速化のために、いちいち毎回データベースにアクセスするような仕様にはなっていない。つまり、データベースを更新したところで、streamlit上のローカルにあるデータベースがあればそちらを使って、わざわざ新たにデータベースにアクセスするようなことはしない。
ということだと思います。
具体的解決策
というわけで、今回は提案1の方を採用し解決していこうと思います。以下実行コードです。
import os
import requests
# GitHubからデータベースファイルをダウンロード
def download_database():
url = "https://raw.githubusercontent.com/ユーザー名/リポジトリ名/ブランチ名/データベースファイル名.db"
response = requests.get(url)
with open("local_database.db", "wb") as file:
file.write(response.content)
# アプリ起動時にダウンロードを実行
download_database()
このコードをstreamlitの実行ファイルの冒頭に記述することで、毎回アプリを起動する毎に『データ更新されてないかな?』と最新のデータベースにアクセスしてくれるようになります。