예: Snowflake에 쓰는 양식 빌드

이 예제에서는 양식을 통해 사용자 입력을 수집하여 Snowflake 테이블에 쓰는 Streamlit in Snowflake 앱을 빌드하는 과정을 안내합니다. 또한 앱은 데이터를 다시 읽어서 제출된 모든 항목을 표시하고 :code:`st.user`를 사용하여 각 항목을 제출한 사용자를 추적합니다.

이 앱은 Container Runtime을 사용합니다. 시작하기 전에 :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`인 파일을 생성합니다. 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.

  • 데이터 쓰기를 위한 Snowpark 세션을 가져오는 st.connection("snowflake").session(). 자세한 내용은 시크릿 관리 및 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``를 추가하면 requirements.txt 파일에서 선언합니다.

plotly

더 복잡한 종속성 시나리오의 경우 pyproject.toml 파일을 대신 사용할 수 있습니다. 자세한 내용은 Streamlit 앱의 종속성 관리하기 섹션을 참조하십시오.

정리

이 예제에서 생성된 리소스를 제거하려면 다음 SQL을 실행합니다.

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

다음에는 무엇을 해야 합니까?