Pada penghujung Julai 2024, Current_User dan Dasar Akses Baris tersedia dalam Streamlit in Snowflake.
Bahagian menarik dalam kemas kini ini ialah kini mudah dan selamat untuk mengenal pasti pengguna Snowflake yang disambungkan ke aplikasi dan menyesuaikan pemprosesan untuk setiap pengguna.
Tanpa perlu menyediakan mekanisme log masuk tersuai atau jadual pengurusan pengguna, anda boleh memperibadikan satu aplikasi untuk setiap pengguna dengan cara seperti:
Dalam siaran ini, kami akan membuat senarai Tugasan mudah yang memaparkan maklumat pengguna individu.
Nota: Catatan ini mewakili pandangan peribadi saya dan bukan pandangan Snowflake.
Skrin pengguna TKANNO
Skrin TARO pengguna
Laksanakan arahan berikut daripada lembaran kerja:
-- 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) );
Dasar ini mengembalikan baris yang pemilik dalam jadual todo_list sepadan dengan current_user yang disambungkan ke aplikasi Streamlit in Snowflake.
Laksanakan arahan berikut daripada lembaran kerja:
-- Create row access policy CREATE ROW ACCESS POLICY IF NOT EXISTS todo_row_access_policy AS (owner VARCHAR) RETURNS BOOLEAN -> owner = CURRENT_USER();
Laksanakan arahan berikut daripada lembaran kerja:
-- Apply row access policy ALTER TABLE todo_list ADD ROW ACCESS POLICY todo_row_access_policy ON (owner);
Ini melengkapkan operasi lembaran kerja.
Buat Streamlit baharu dalam apl Snowflake dan salin & tampal kod berikut:
Barisan 14 ialah tempat pengguna semasa yang disambungkan ke apl itu diambil sebagai rentetan.
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()
Apa pendapat anda? Dengan menggabungkan Current_User dan dasar akses baris, anda boleh membuat aplikasi selamat yang diperibadikan untuk setiap pengguna dengan langkah mudah. Ini membuka kemungkinan untuk mencipta aplikasi yang lebih mesra pengguna berdasarkan idea anda.
Sesetengah idea lanjutan termasuk menambah maklumat Current_User sebagai tandatangan semasa menulis pada jadual melalui Streamlit in Snowflake, atau menggunakan maklumat diperibadikan sebagai konteks untuk Cortex LLM untuk mencipta pembantu peribadi.
Sila cuba mencabar diri anda dengan penggunaan Current_User yang menarik!
Saya berkongsi kemas kini Snowflake's What's New pada X. Sila ikuti jika anda berminat!
Snowflake What's New Bot (Versi Bahasa Inggeris)
https://x.com/snow_new_en
Bot Baharu Kepingan Salji (Versi Jepun)
https://x.com/snow_new_jp
(20240914) Catatan awal
https://zenn.dev/tsubasa_tech/articles/a23029dfe97c46
Atas ialah kandungan terperinci Peribadikan untuk setiap pengguna dengan Streamlit in Snowflake (SiS). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!