【Python】Streamlitで簡易データベースアプリを作ろう!名言アプリを例に解説
みなさん、こんにちは!今回は、PythonのフレームワークであるStreamlitを使って、簡易的なデータベースアプリを作成する方法をご紹介します。
データベースというと、MySQLやPostgreSQLのような本格的なものを想像するかもしれません。しかし、小規模なデータであれば、Excelファイルをデータベースのように扱うことも可能です。
今回は、名言をランダムに表示する名言アプリを例に、Excelファイルを使った簡易データベースアプリの作成方法を解説していきます。
Streamlitとは?
Streamlitは、Pythonでウェブアプリを簡単に作成できるフレームワークです。HTMLやCSSの知識がなくても、Pythonのコードだけでインタラクティブなウェブアプリを構築できます。
Streamlitの主な特徴は以下の通りです。
ウェブアプリが簡単に作成できる
HTML、CSS不要
デプロイが簡単
サーバー使用料が無料(Streamlit Community Cloud)
小さな組織、チームでアプリを共有するのに最適
今回の内容
今回の名言アプリでは、以下の機能を実装します。
Excelファイルをデータベースとして使用
データの読み込み、追加、削除機能
環境
今回の解説では、以下の環境を使用しています。
Windows10
Python 3.11.4
アプリの概要
アプリを起動すると、Excelファイルからランダムに選ばれた名言が大きく表示されます。サイドバーには、行の追加と削除を行うためのセレクトボックスがあります。
コード解説
インストール
まずは、必要なライブラリをインストールします。
pip install streamlit pandas openpyxl
インポート
必要なライブラリをインポートします。
import streamlit as st
import pandas as pd
import openpyxl
import random
Excelファイルの準備
ルートディレクトリに、meigen.xlsxという名前のExcelファイルを作成します。
Excelファイルの内容は以下の通りです。
A列:インデックス番号(0から始まる)
B列:内容(名言)
タイトル設定
st.set_page_config(page_title='名言app')
st.title('名言app')
st.set_page_config(page_title="名言app"):ブラウザのタブに表示されるタイトルを設定します。
st.title("名言app"):アプリの画面に表示されるタイトルを設定します。
データの読み込み
df = pd.read_excel('meigen.xlsx', sheet_name='Sheet1',index_col=0)
pd.read_excel():pandasの関数で、Excelファイルを読み込みます。
sheet_name="Sheet1":読み込むシート名を指定します。
index_col=0:インデックス列を指定します。ここでは、A列をインデックス列として使用します。
データの表示
with st.expander('df', expanded=False):
st.table(df)
st.expander():展開可能なセクションを作成します。
expanded=False:初期状態ではセクションを閉じておきます。
st.table():データフレームをテーブル形式で表示します。
ランダムな名言の表示
st.markdown('##### 今日の名言')
len_df = len(df)
#乱数取得
num = random.randint(0,len_df-1)
#dfから行を抽出 series
s_selected = df.loc[num]
#seriesから値の抽出
val = s_selected.loc['内容']
st.markdown(f'## {val}')
st.markdown():Markdown形式でテキストを表示します。
len(df):データフレームの行数を取得します。
random.randint(0, len_df-1):0から行数-1までの範囲でランダムな整数を生成します。
df.iloc[num]:ランダムに選ばれた行のデータを抽出します。
s_selected.loc['内容']:抽出されたデータから、'内容'列の値を取得します。
st.markdown(f"## {val}"):取得した名言を大きく表示します。
行の追加
def add_row():
new_text = st.text_input('追加する名言を入力', key='new_text')
if new_text != '':
# 追加する新しい行のデータを作成
new_row = {'内容': new_text}
# dfのindexの最大値+1で新indexを作成
global df # df をグローバル変数として宣言
# 新しい行を追加
df.loc[len_df] = new_row
# dfのエクセル出力
df.to_excel('meigen.xlsx')
st.table(df)
st.text_input():テキスト入力欄を作成します。
key='new_text':入力欄に一意なキーを設定します。
if new_text != '':入力欄に何か入力された場合のみ、以下の処理を実行します。
new_row = {'内容': new_text}:新しい行のデータを作成します。ここでは、'内容'列にのみ値を設定しています。
global df:関数の外で定義されたデータフレームdfを使用することを宣言します。
df.loc[len(df)] = new_row:データフレームの末尾に新しい行を追加します。
df.to_excel("meigen.xlsx"):更新されたデータフレームをExcelファイルに上書きします。
st.table(df):更新されたデータフレームをテーブル形式で表示します。
行の削除
def drop_row():
with st.form('form'):
num_delete = st.number_input('削除する行番号を入力', step=1, key='num_delete')
submitted = st.form_submit_button('submitted')
if submitted:
# 行を削除
global df # df をグローバル変数として宣言
df = df.drop(num_delete)
# インデックスをリセット 元のindexは使用しない
df = df.reset_index(drop=True)
#dfのエクセル出力
df.to_excel('meigen.xlsx')
st.table(df)
st.form('form'):フォームを作成します。
st.number_input():数値入力欄を作成します。
step=1:入力値を1ずつ増減させるように設定します。
key='num_delete':入力欄に一意なキーを設定します。
st.form_submit_button('submit'):フォームの送信ボタンを作成します。
if submitted::送信ボタンが押された場合のみ、以下の処理を実行します。
df.drop(index=num_delete):指定されたインデックス番号の行を削除します。
df.reset_index(drop=True):インデックスを振り直します。drop=Trueとすることで、元のインデックス列を削除します。
df.to_excel("meigen.xlsx"):更新されたデータフレームをExcelファイルに上書きします。
st.table(df):更新されたデータフレームをテーブル形式で表示します。
サイドバー
def main():
# アプリケーション名と対応する関数のマッピング
apps = {
'-': None,
'行の追加': add_row,
'行の削除': drop_row
}
selected_app_name = st.sidebar.selectbox(label='項目の選択',
options=list(apps.keys()))
if selected_app_name == '-':
st.info('行の追加・削除はサイドバーから')
st.stop()
# 選択されたアプリケーションを処理する関数を呼び出す
render_func = apps[selected_app_name]
render_func()
if __name__ == '__main__':
main()
st.sidebar.selectbox():サイドバーにセレクトボックスを作成します。
options=list(apps.keys()):セレクトボックスの選択肢を設定します。
if selected_app_name == '-':'-'が選択された場合のみ、以下の処理を実行します。
st.info(apps[selected_app_name]):選択された項目の説明を表示します。
st.stop():コードの実行を停止します。
if selected_app_name::何かが選択された場合のみ、以下の処理を実行します。
apps[selected_app_name]:関数を選択。
render_func():関数を実行
アプリの実行
作成したPythonファイルを実行するには、コマンドプロンプトで以下のコマンドを実行します。
streamlit run ファイル名.py
これで、ローカル環境で名言アプリを実行できます。
まとめ
今回は、Streamlitで簡易的なデータベースアプリを作成する方法をご紹介しました。Excelファイルをデータベースのように扱うことで、小規模なデータであれば簡単にアプリを構築できます。ぜひ、ご自身のアイデアを形にするために、Streamlitを活用してみてください。