2024 年 7 月底,Snowflake 中的 Streamlit 中提供了 Current_User 和行存取策略。
這個更新令人興奮的部分是,現在可以輕鬆、安全地識別連接到應用程式的 Snowflake 用戶並為每個用戶自訂處理。
無需設定自訂登入機製或使用者管理表,您可以透過以下方式為每個使用者個性化單一應用程式:
在這篇文章中,我們將建立一個簡單的待辦事項清單來顯示個人使用者資訊。
註:本文僅代表個人觀點,不代表Snowflake。

使用者TKANNO的螢幕

使用者TARO的螢幕
從工作表執行以下指令:
-- Create ToDo list table
CREATE TABLE IF NOT EXISTS todo_list (
id INT AUTOINCREMENT,
task VARCHAR(255),
status VARCHAR(20),
due_date DATE,
completed_date DATE,
owner VARCHAR(50)
);
此策略傳回 todo_list 表中的擁有者與連接到 Snowflake 應用程式中的 Streamlit 的 current_user 相符的行。
從工作表執行以下指令:
-- Create row access policy
CREATE ROW ACCESS POLICY IF NOT EXISTS todo_row_access_policy
AS (owner VARCHAR) RETURNS BOOLEAN ->
owner = CURRENT_USER();
從工作表執行以下指令:
-- Apply row access policy ALTER TABLE todo_list ADD ROW ACCESS POLICY todo_row_access_policy ON (owner);
至此完成了工作表操作。
在 Snowflake 應用程式中建立一個新的 Streamlit,然後複製並貼上以下程式碼:
第 14 行是以字串形式檢索連接到應用程式的目前使用者的位置。
import streamlit as st
from snowflake.snowpark.context import get_active_session
import pandas as pd
# Layout settings
st.set_page_config(
layout="wide"
)
# Get Snowflake session
session = get_active_session()
# Get current user
current_user = session.sql("SELECT CURRENT_USER()").collect()[0][0]
# Get ToDo list
def get_todo_list():
return session.table("todo_list").to_pandas()
# Add or update task
def upsert_task(task_id, task, status, due_date, completed_date):
due_date_sql = f"'{due_date}'" if due_date else "NULL"
completed_date_sql = f"'{completed_date}'" if completed_date else "NULL"
if task_id:
session.sql(f"""
UPDATE todo_list
SET task = '{task}', status = '{status}', due_date = {due_date_sql}, completed_date = {completed_date_sql}
WHERE id = {task_id}
""").collect()
else:
session.sql(f"""
INSERT INTO todo_list (task, status, owner, due_date, completed_date)
VALUES ('{task}', '{status}', '{current_user}', {due_date_sql}, {completed_date_sql})
""").collect()
# Delete task
def delete_task(task_id):
session.sql(f"DELETE FROM todo_list WHERE id = {task_id}").collect()
# Main function
def main():
st.title(f"{current_user}'s Personal Dashboard")
# Task list
st.subheader(f"{current_user}'s ToDo List")
todo_df = get_todo_list()
# Display header
col1, col2, col3, col4, col5 = st.columns([3, 2, 2, 2, 2])
col1.write("Task")
col2.write("Status")
col3.write("Due Date")
col4.write("Completed Date")
col5.write("Delete")
# Display task list
for _, row in todo_df.iterrows():
col1, col2, col3, col4, col5 = st.columns([3, 2, 2, 2, 2])
with col1:
task = st.text_input("task", value=row['TASK'], key=f"task_{row['ID']}", label_visibility="collapsed")
with col2:
status = st.selectbox("status", ["Pending", "In Progress", "Completed"], index=["Pending", "In Progress", "Completed"].index(row['STATUS']), key=f"status_{row['ID']}", label_visibility="collapsed")
with col3:
due_date = st.date_input("due_date", value=pd.to_datetime(row['DUE_DATE']).date() if pd.notna(row['DUE_DATE']) else None, key=f"due_date_{row['ID']}", label_visibility="collapsed")
with col4:
completed_date = st.date_input("comp_date", value=pd.to_datetime(row['COMPLETED_DATE']).date() if pd.notna(row['COMPLETED_DATE']) else None, key=f"completed_date_{row['ID']}", label_visibility="collapsed")
with col5:
if st.button("Delete", key=f"delete_{row['ID']}"):
delete_task(row['ID'])
st.experimental_rerun()
# Update database immediately if values change
if task != row['TASK'] or status != row['STATUS'] or due_date != row['DUE_DATE'] or completed_date != row['COMPLETED_DATE']:
upsert_task(row['ID'], task, status, due_date, completed_date)
st.experimental_rerun()
# Add new task
st.subheader("Add New Task")
new_task = st.text_input("New Task")
new_status = st.selectbox("Status", ["Pending", "In Progress", "Completed"])
new_due_date = st.date_input("Due Date")
if st.button("Add"):
upsert_task(None, new_task, new_status, new_due_date, None)
st.success("New task added")
st.experimental_rerun()
# Main process
if __name__ == "__main__":
main()
你覺得怎麼樣?透過結合 Current_User 和行存取策略,您可以透過簡單的步驟為每個使用者建立個人化的安全應用程式。這為根據您的想法創建更用戶友好的應用程式提供了可能性。
一些先進的想法包括在 Snowflake 中透過 Streamlit 寫入表時添加 Current_User 資訊作為簽名,或使用個人化資訊作為 Cortex LLM 的上下文來建立個人助理。
請嘗試用 Current_User 的有趣用途來挑戰自己!
我正在分享 Snowflake 在 X 上的最新動態。如果您有興趣,請隨時關注!
雪花新鮮事機器人(英文版)
https://x.com/snow_new_en
雪花What's New Bot(日文版)
https://x.com/snow_new_jp
(20240914) 初始貼文
https://zenn.dev/tsubasa_tech/articles/a23029dfe97c46
以上是使用 Snowflake (SiS) 中的 Streamlit 為每個使用者進行個人化的詳細內容。更多資訊請關注PHP中文網其他相關文章!