示例:构建写入 Snowflake 的表单

本示例将引导您构建一个 Streamlit in Snowflake 应用程序,该应用通过表单收集用户输入并将其写入 Snowflake 表。该应用还会回读数据以显示所有提交内容,并使用 st.user 跟踪每条记录的提交者。

该应用程序使用容器运行时。在开始之前,请确保您已完成 先决条件

设置目标表

本示例使用名为 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
);

编写应用程序代码

在本地计算机上,创建一个名为 streamlit_app.py 的文件,其中包含以下代码。如果您计划使用 Snowsight,您可以在创建应用程序后将此代码粘贴到编辑器中。

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 应用程序

  • session.sql() 而非 conn.query() 回读提交内容。conn.query() 默认会缓存结果,因此新条目需等待缓存过期后才会显示。session.sql() 则在每次重新运行时执行全新查询。

  • st.user.user_name 记录每个条目的提交者。有关更多信息,请参阅 使用用户信息个性化您的 Streamlit 应用程序

声明依赖关系

此应用程序仅使用 streamlit 以及内置的 Snowflake 连接,因此不需要额外的依赖关系。

有关更多信息,请参阅 管理 Streamlit 应用程序的依赖项

部署应用程序

  1. 登录 Snowsight

  2. 在导航菜单中,选择 Projects » Streamlit

  3. 选择 + Streamlit App

  4. 输入 feedback_app 作为应用程序名称。

  5. 选择数据库和架构。

  6. 选择 Run on container,然后选择一个计算池和查询仓库。

  7. 选择 Create

  8. 在编辑器中,将起始代码替换为上面的应用程序代码。

  9. 选择 Run

试用应用程序

  1. 在浏览器中打开应用程序。

  2. 填写表单字段并选择 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,请在 requirements.txt 文件中声明它:

plotly

对于更复杂的依赖关系场景,可以改用 pyproject.toml 文件。有关更多信息,请参阅 管理 Streamlit 应用程序的依赖项

清理

要移除此示例中创建的资源,请运行以下 SQL:

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

下一步是什么?