Exemplo: Criar um formulário que grave no Snowflake

Este exemplo orienta você na criação de um app Streamlit in Snowflake que coleta a entrada do usuário por meio de um formulário e a grava em uma tabela do Snowflake. O app também lê os dados de volta para exibir todos os envios e usa st.user para rastrear quem enviou cada entrada.

O app usa um tempo de execução de contêiner. Antes de começar, certifique-se de ter concluído os pré-requisitos.

Configurar a tabela de destino

Este exemplo usa um banco de dados chamado crud_demo. Você pode substituir por qualquer banco de dados e esquema aos quais tenha acesso; basta atualizar as referências no código do app e SQL para que correspondam.

Crie uma tabela para armazenar os envios do formulário. Execute o seguinte SQL em uma planilha ou sessão 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
);

Escrever o código do app

Em sua máquina local, crie um arquivo chamado streamlit_app.py com o seguinte código. Se você planeja usar o Snowsight, pode colar este código no editor após criar o app.

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)

Este app usa:

  • st.form para coletar a entrada antes do envio, evitando novas execuções a cada interação com o widget.

  • st.connection("snowflake").session() para obter uma sessão do Snowpark para gravar dados. Para obter mais informações, consulte Gerenciamento de segredos e configuração do app Streamlit.

  • session.sql() em vez de conn.query() para ler os envios de volta. conn.query() armazena os resultados em cache por padrão; portanto, novas entradas não aparecerão até que o cache expire. session.sql() executa uma nova consulta a cada nova execução.

  • st.user.user_name para registrar quem enviou cada entrada. Para obter mais informações, consulte Personalizar seu app Streamlit com informações do usuário.

Declarar dependências

Este app usa apenas streamlit e a conexão Snowflake integrada; portanto, nenhuma dependência adicional é necessária.

Para obter mais informações, consulte Gerenciamento de dependências para o app Streamlit.

Implantar o app

  1. Faça login no Snowsight.

  2. No menu de navegação, selecione Projects » Streamlit.

  3. Selecione + Streamlit App.

  4. Insira feedback_app como o nome do app.

  5. Selecione um banco de dados e um esquema.

  6. Selecione Run on container e, em seguida, escolha um pool de computação e um warehouse de consultas.

  7. Selecione Create.

  8. No editor, substitua o código inicial pelo código do app acima.

  9. Selecione Run.

Experimente o app

  1. Abra o app no seu navegador.

  2. Preencha os campos do formulário e selecione Submit.

  3. A tabela de feedback abaixo do formulário é atualizada para mostrar o novo envio, incluindo seu endereço de e-mail e um carimbo de data/hora.

  4. Envie mais algumas entradas e, em seguida, tente filtrar ou classificar os dados na tabela.

Expandir o app

Experimente adicionar um botão de exclusão ao lado de cada linha ou um gráfico que mostre a classificação média por categoria. Por exemplo, adicione o seguinte após o dataframe:

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)

Se você adicionar plotly, declare-o em um arquivo requirements.txt:

plotly

Para cenários de dependência mais complexos, você pode usar um arquivo pyproject.toml. Para obter mais informações, consulte Gerenciamento de dependências para o app Streamlit.

Limpeza

Para remover os recursos criados neste exemplo, execute o seguinte SQL:

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

Qual é o próximo passo?