見出し画像

【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を活用してみてください。

よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!