Connexion Streamlit Snowflake
Connectez votre app Streamlit à Snowflake correctement.
Utiliser st.connection
Utilisez toujours st.connection("snowflake") à la place des connecteurs bruts.
import streamlit as st
conn = st.connection("snowflake")
# Query data
df = conn.query("SELECT * FROM my_table LIMIT 100")
st.dataframe(df)
Pourquoi st.connection :
- Pooling de connexion automatique
- Caching intégré
- Gère la reconnexion
- Fonctionne avec st.secrets
Connexion avec les droits de l'appelant (Streamlit 1.53+)
Pour les apps exécutées dans Snowflake, utilisez les droits de l'appelant pour exécuter les requêtes avec les permissions du visualiseur au lieu de celles du propriétaire de l'app :
conn = st.connection("snowflake", type="snowflake-callers-rights")
C'est utile quand :
- Différents utilisateurs doivent voir différentes données selon leurs rôles Snowflake
- Vous voulez que la sécurité au niveau des lignes s'applique selon le visualiseur
- Vous ne voulez pas que l'app ait des permissions élevées
Requêtes mises en cache
Utilisez le paramètre ttl intégré pour mettre en cache les résultats des requêtes :
from datetime import timedelta
conn = st.connection("snowflake")
# Cache pour 10 minutes
df = conn.query("SELECT * FROM metrics", ttl=timedelta(minutes=10))
# Cache pour 1 heure
df = conn.query("SELECT * FROM reference_data", ttl=3600)
Configurer avec st.secrets
Stockez les identifiants dans .streamlit/secrets.toml (ne validez jamais ce fichier).
CRITIQUE : Dérivez les valeurs account et host de la configuration de connexion Snowflake CLI de l'utilisateur. Exécutez snow connection list et utilisez les valeurs exactes. Un account incorrect vous redirigera vers la mauvaise page de connexion.
# .streamlit/secrets.toml
[connections.snowflake]
account = "ORGNAME-ACCTNAME" # from `snow connection list`
host = "myaccount.snowflakecomputing.com" # from `snow connection list` (include if present)
user = "your_user"
authenticator = "externalbrowser"
warehouse = "your_warehouse"
database = "your_database"
schema = "your_schema"
Ajoutez à .gitignore :
.streamlit/secrets.toml
Requêtes paramétrées
Utilisez des paramètres pour éviter les injections SQL :
conn = st.connection("snowflake")
# Safe: parameterized
df = conn.query(
"SELECT * FROM users WHERE region = :region",
params={"region": selected_region}
)
# UNSAFE: string formatting - don't do this
# df = conn.query(f"SELECT * FROM users WHERE region = '{selected_region}'")
Écrire des données
Utilisez la session pour les opérations d'écriture :
conn = st.connection("snowflake")
session = conn.session()
# Write a dataframe
session.write_pandas(df, "MY_TABLE", auto_create_table=True)
# Execute statements
session.sql("INSERT INTO logs VALUES (:ts, :msg)", params={...}).collect()
Connexions multiples
Définissez plusieurs connexions dans secrets :
# .streamlit/secrets.toml
[connections.snowflake]
account = "prod_account"
# ... prod credentials
[connections.snowflake_staging]
account = "staging_account"
# ... staging credentials
prod_conn = st.connection("snowflake")
staging_conn = st.connection("snowflake_staging")
Converser avec Cortex
Créez une interface de chat en utilisant les LLMs Snowflake Cortex :
import streamlit as st
from snowflake.cortex import complete
st.set_page_config(page_title="AI Assistant", page_icon=":sparkles:")
if "messages" not in st.session_state:
st.session_state.messages = []
for msg in st.session_state.messages:
with st.chat_message(msg["role"]):
st.write(msg["content"])
if prompt := st.chat_input("Ask anything"):
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.write(prompt)
with st.chat_message("assistant"):
response = st.write_stream(
complete(
"claude-3-5-sonnet",
prompt,
session=st.connection("snowflake").session(),
stream=True,
)
)
st.session_state.messages.append({"role": "assistant", "content": response})
Consultez building-streamlit-chat-ui pour plus de patterns de chat (avatars, suggestions, gestion historique).
Caveat sur la dépendance Python 3.12+
streamlit[snowflake] limite snowflake-connector-python à python_version < "3.12". Sur Python 3.12+, le connecteur est silencieusement ignoré et vous obtenez No module named 'snowflake' au runtime. Ajoutez toujours snowflake-connector-python>=3.3.0 comme dépendance explicite dans pyproject.toml :
dependencies = [
"snowflake-connector-python>=3.3.0",
"streamlit[snowflake]>=1.54.0",
]