AIアプリ開発入門 第5回|データを記録して本格的なツールにしよう(DB保存の基礎)

前回は、アプリをクラウド(Streamlit Cloud)で公開し、自分以外の誰もがアクセスできる状態にしました。
しかし、今のアプリには1つ大きな弱点があります。それは「ブラウザを閉じると、過去に作った記事やAIとのやり取りがすべて消えてしまう」ということです。

第3回で学んだ st.session_state は、あくまで「一時的な記憶(メモリ)」でした。 今回は、これを「永久的な記録(データベース)」にアップグレードし、「ユーザーごとに過去の履歴を保存できる本格的なツール」に進化させるための基礎知識を解説します。


目次

1. なぜ st.session_state だけではダメなのか?

st.session_state は、一時的なデータの保管には最適ですが、以下のような制限があります。

  1. 寿命が短い
    ユーザーがブラウザのタブを閉じた瞬間、あるいはページをリロード(F5)した瞬間に、金庫の中身はすべて消去されます。
  2. 容量に限界がある
    Streamlit Cloudの無料枠では、アプリ全体で使えるメモリ(RAM)が「約1GB」に制限されています。 そのため、過去の大量の履歴や、巨大なファイルをずっと保持させようとすると、サーバーがパンクしてアプリがクラッシュ(エラーで停止)してしまいます。

「昨日の続きから作業したい」「他の人に自分が作った結果を見せたい」といった本格的な機能(SaaSのような仕組み)を作るには、データをサーバーの外に「永久保存(永続化)」する必要があります。


2. ローカル最強のデータベース「SQLite」

データを保存する最も簡単で有名な方法が、SQLite(エスキューライト)というデータベースを使うことです。
Pythonには最初から組み込まれているため、新たなインストールなしですぐに使えます。

pythonimport sqlite3

# データベース(ファイル)を作成して繋ぐ
conn = sqlite3.connect('my_history.db')

これを使うと、my_history.db という名前のファイルが作られ、そこにデータが記録されていきます。

SQLiteの大きな罠

一見完璧に見えるSQLiteですが、Streamlit Cloudで動かす場合には致命的な罠があります。

Streamlit Cloudのサーバーは、数日間アクセスがなかったり、アプリのコードを更新(再デプロイ)したりするたびに、サーバーの中身がまるごと初期化(リセット)される仕様になっています。
つまり、せっかく作った my_history.db というファイルも、サーバーの初期化とともに綺麗に消滅してしまうのです。

結論として、SQLiteは「自分のパソコン(ローカル環境)で自分専用のツールを動かすとき」には最強ですが、「クラウドで一般公開するアプリ」には使えません。


3. クラウドで本番運用するなら「Supabase」や「Firebase」

クラウド環境でデータが消える問題を防ぐにはどうすればよいでしょうか?
答えは簡単です。Streamlitのサーバーの中に保存するのではなく、「データを永久保存するための専門のサービス(外部データベース)」にデータを預ければよいのです。

現在、モダンなWebアプリ開発で最も人気があるのが Supabase(スーパベース)Firebase(ファイアベース) といったクラウドデータベースです。

どうやって通信するのか?

これらを使う場合も、実はGemini APIのときと全く同じ「API通信(JSON形式)」の仕組みを使います。

  1. 保存するとき:PythonからSupabaseのAPIに対して「このデータを保存して」とJSONデータを送る。
  2. 読み込むとき:PythonからSupabaseのAPIに対して「過去の履歴をちょうだい」とリクエストを送り、JSONデータを受け取って画面に表示する。

データの実体はSupabaseの強固なサーバーに保管されるため、Streamlitのアプリが何度再起動しようが、パソコンが壊れようが、データは絶対に消えません。


4. ユーザーごとのデータ管理(ログイン機能)

SupabaseやFirebaseを使う最大のメリットは、データベースだけでなく「ユーザー認証(ログイン機能)」がセットで付いてくることです。

これにより、「AさんはAさんの履歴だけ」「BさんはBさんの履歴だけ」を見られるようにする、本格的な会員制サービス(SaaS)が作れます。

本格ツールの処理の流れ:

  1. ユーザーがメールアドレスとパスワードでログインする。
  2. Streamlitの session_state に「今のユーザーはAさんである」という情報を一時記憶させる。
  3. 記事を生成したら、Supabaseに「Aさんのデータ」として保存する。
  4. 次にログインしたとき、Supabaseから「Aさんのデータ」だけを呼び出して画面に表示する。

このように、「一時記憶(session_state)」と「永久保存(データベース)」を組み合わせることで、世の中にある多くのWebサービスと同じ仕組みを作ることができます。


今回のまとめ

今回は、アプリを本格的なサービスに進化させるための「データ保存」について学びました。

  1. st.session_state:ブラウザを閉じると消える「一時記憶」。容量制限があるため保存には不向き。
  2. SQLite:ローカル(自分のPC)で使うには最強だが、Streamlit Cloudでは定期的に消滅してしまうため本番公開には使えない。
  3. Supabase / Firebase:クラウドでデータを永久保存するための外部サービス。APIで通信し、ログイン機能も作れる。

「とりあえず動くAIツール」を作りたいならデータベースは不要です。しかし、「ユーザーに継続して使ってもらうサービス」を作りたい場合は、Supabaseなどの外部データベースとの連携が必須になります。

次回(最終回)は、Streamlitを卒業して、より大規模なサービスやデザイン性の高いWebサイトを作るための「アーキテクチャの比較と選び方(VercelやWordPressとの連携)」について解説します。


初心者向けの参考リソース

Streamlitとデータベースの連携について知りたい方へ

Supabase・Firebaseを使った本格的な保存について知りたい方へ

注意事項

本記事の内容は執筆時点の情報をもとに作成しています。
Python、Streamlit、Gemini API、GitHub、Streamlit Cloud、Supabase、Vercel、Cloudflare、Google Cloud などの仕様、料金、UI、提供条件は予告なく変更される場合があります。

記事内のコード、設定例、画面構成は学習用・検証用のサンプルです。
実際の運用環境に導入する場合は、公式ドキュメントを確認したうえで、ご自身の責任で検証・調整してください。

APIキー、認証情報、個人情報、業務データなどの機密情報は、記事中のサンプル通りであっても公開リポジトリや公開画面にそのまま掲載しないでください。
外部サービス利用時の課金、障害、セキュリティ事故、データ消失などについて、当サイトは責任を負いません。

ListeningMind サービス紹介資料

こちらの資料は、検索データを活用した消費者分析ツールListeningMind」のサービス概要を紹介するプレゼンテーション資料です。

ご興味のある方は、ぜひ資料をこちらからダウンロードしてご覧ください。

著者について

目次