例:Snowflakeに書き込むフォームをビルドする

この例では、フォームからユーザー入力を収集し、Snowflakeテーブルに書き込む|sis|アプリの構築について説明します。アプリはまた、データを読み込んですべての送信を表示し、:code:`st.user`を使用して誰が各エントリを送信したかを追跡します。

アプリはコンテナランタイムを使用します。始める前に、:ref:`前提条件<label-streamlit_prereqs>`を完了していることを確認してください。

ターゲットテーブルの設定

この例では、``crud_demo``というデータベースを使用します。アクセスできる任意のデータベースとスキーマに置き換えることができます。SQLとアプリコード内の参照を一致するように更新するだけです。

フォーム送信を保存するテーブルを作成します。ワークシートまたはSQLセッションで次のSQLを実行します。

CREATE OR REPLACE TABLE crud_demo.public.feedback (
   submitted_at TIMESTAMP_NTZ DEFAULT CURRENT_TIMESTAMP(),
   submitted_by VARCHAR,
   category VARCHAR,
   rating INTEGER,
   comments VARCHAR
);

アプリコードの記述

ローカルマシンで、次のコードを使用して:file:`streamlit_app.py`という名前のファイルを作成します。|sf-web-interface|を使用する予定の場合は、アプリを作成した後にこのコードをエディターに貼り付けることができます。

import streamlit as st

st.title("Feedback Form")
st.write(f"Logged in as: {st.user.user_name}")

conn = st.connection("snowflake")
session = conn.session()

with st.form("feedback_form"):
    category = st.selectbox(
        "Category", ["Bug Report", "Feature Request", "General Feedback"]
    )
    rating = st.slider("Rating", 1, 5, 3)
    comments = st.text_area("Comments")
    submitted = st.form_submit_button("Submit")

if submitted:
    session.sql(
        """
        INSERT INTO crud_demo.public.feedback
            (submitted_by, category, rating, comments)
        VALUES (?, ?, ?, ?)
        """,
        params=[st.user.user_name, category, rating, comments],
    ).collect()
    st.success("Feedback submitted!")

st.subheader("Last 10 submissions")
data = session.sql(
    "SELECT * FROM crud_demo.public.feedback ORDER BY submitted_at DESC LIMIT 10"
).to_pandas()
st.dataframe(data, use_container_width=True)

このアプリは以下を使用します。

  • st.form:送信する前に入力を収集し、すべてのウィジェットインタラクションでの再実行を防ぎます。

  • st.connection("snowflake").session():データを書き込むためのSnowparkセッションを取得します。詳細については、 シークレットを管理し、Streamlitアプリを設定する をご参照ください。

  • conn.query()`ではなく:code:`session.sql():送信を再度読み取ります。:code:`conn.query()`はデフォルトで結果をキャッシュするため、キャッシュの有効期限が切れるまで新しいエントリは表示されません。:code:`session.sql()`は再実行のたびに新しいクエリを実行します。

  • st.user.user_name:誰が各エントリを送信したかを記録します。詳細については、 ユーザー情報によるStreamlitアプリのパーソナライズ をご参照ください。

依存関係の宣言

このアプリは``streamlit``と組み込みのSnowflake接続のみを使用するため、追加の依存関係は必要ありません。

詳細については、 Streamlitアプリの依存関係を管理する をご参照ください。

アプリのデプロイ

  1. Snowsight にサインインします。

  2. ナビゲーションメニューで Projects » Streamlit を選択します。

  3. + Streamlit App を選択します。

  4. アプリ名として``feedback_app``を入力します。

  5. データベースとスキーマを選択します。

  6. :ui:`Run on container`を選択し、次にコンピューティングプールとクエリウェアハウスを選択します。

  7. Create を選択します。

  8. エディターで、スターターコードを上記のアプリコードに置き換えます。

  9. Run を選択します。

アプリを試す

  1. ブラウザーでアプリを開きます。

  2. フォームフィールドに入力し、:ui:`Submit`を選択します。

  3. フォームの下にあるフィードバックテーブルが更新され、メールアドレスとタイムスタンプを含む新しい送信が表示されます。

  4. さらにいくつかのエントリを送信してから、テーブル内のデータのフィルターまたはソートを試してください。

アプリの拡張

各行の横に削除ボタン、またはカテゴリ別に平均評価を示すチャートを追加してみてください。たとえば、データフレームの後に以下を追加します。

import plotly.express as px

if not data.empty:
    avg_ratings = data.groupby("CATEGORY")["RATING"].mean().reset_index()
    fig = px.bar(avg_ratings, x="CATEGORY", y="RATING", title="Average Rating by Category")
    st.plotly_chart(fig, use_container_width=True)

``plotly``を追加する場合は、:file:`requirements.txt`ファイルで宣言します。

plotly

より複雑な依存関係シナリオの場合は、代わりに:file:pyproject.toml`ファイルを使用できます。詳細については、 :doc:../app-development/dependency-management` をご参照ください。

クリーンアップする

この例で作成したリソースを削除するには、次のSQLを実行します。

DROP STREAMLIT IF EXISTS crud_demo.public.feedback_app;
DROP TABLE IF EXISTS crud_demo.public.feedback;

次の内容