Exemple : Créer un formulaire qui écrit dans Snowflake

Cet exemple vous guide à travers la création d’une application Streamlit in Snowflake qui collecte les données utilisateur via un formulaire et les écrit dans une table Snowflake. L’application lit également les données pour afficher toutes les soumissions et utilise st.user pour savoir qui a soumis chaque entrée.

L’application utilise un runtime de conteneur. Avant de commencer, assurez-vous d’avoir terminé les conditions préalables.

Configurer la table cible

Cet exemple utilise une base de données appelée crud_demo. Vous pouvez remplacer n’importe quelle base de données et n’importe quel schéma auxquels vous avez accès – il suffit de mettre à jour les références dans le SQL et le code d’application pour qu’elles correspondent.

Créez une table pour stocker les soumissions de formulaire. Exécutez le SQL suivant dans une feuille de calcul ou une session 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
);

Écrire le code de l’application

Sur votre machine locale, créez un fichier nommé streamlit_app.py avec le code suivant. Si vous prévoyez d’utiliser Snowsight, vous pouvez coller ce code dans l’éditeur après la création de l’application.

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)

Cette application utilise :

  • st.form pour collecter les entrées avant de les soumettre, en empêchant les nouvelles exécutions à chaque interaction du widget.

  • st.connection("snowflake").session() pour obtenir une session Snowpark pour l’écriture de données. Pour plus d’informations, voir Gérer les secrets et configurer votre application Streamlit.

  • session.sql() au lieu de conn.query() pour lire les soumissions. conn.query() met en cache les résultats par défaut, de sorte que les nouvelles entrées n’apparaissent pas avant l’expiration du cache. session.sql() exécute une nouvelle requête à chaque nouvelle exécution.

  • st.user.user_name pour enregistrer qui a soumis chaque entrée. Pour plus d’informations, voir Personnaliser l’application Streamlit avec des informations utilisateur.

Déclarer les dépendances

Cette application utilise uniquement streamlit et la connexion Snowflake intégrée, de sorte qu’aucune dépendance supplémentaire n’est requise.

Pour plus d’informations, voir Gérer les dépendances de votre application Streamlit.

Déployer l’application

  1. Connectez-vous à Snowsight.

  2. Dans le menu de navigation, sélectionnez Projects » Streamlit.

  3. Sélectionnez + Streamlit App.

  4. Saisissez feedback_app comme nom de l’application.

  5. Sélectionnez une base de données et un schéma.

  6. Sélectionnez Run on container, puis sélectionnez un pool de calcul et un entrepôt de requêtes.

  7. Sélectionnez Create.

  8. Dans l’éditeur, remplacez le code de démarrage par le code d’application ci-dessus.

  9. Sélectionnez Run.

Essayer l’application

  1. Ouvrez l’application dans votre navigateur.

  2. Remplissez les champs du formulaire et sélectionnez Submit.

  3. Le tableau de commentaires sous le formulaire se met à jour pour afficher votre nouvelle soumission, y compris votre adresse e-mail et un horodatage.

  4. Soumettez quelques entrées supplémentaires, puis essayez de filtrer ou de trier les données de la table.

Développer l’application

Essayez d’ajouter un bouton de suppression à côté de chaque ligne ou un graphique indiquant la note moyenne par catégorie. Par exemple, ajoutez ce qui suit après le 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)

Si vous ajoutez plotly, déclarez-le dans un fichier requirements.txt :

plotly

Pour des scénarios de dépendance plus complexes, vous pouvez utiliser un fichier pyproject.toml à la place. Pour plus d’informations, voir Gérer les dépendances de votre application Streamlit.

Nettoyage

Pour supprimer les ressources créées dans cet exemple, exécutez la commande SQL suivante :

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

Quelle est la prochaine étape ?