Connect Streamlit to Supabase
Introduction
本指南解释了如何从Streamlit社区云安全地访问Supabase实例。它使用了st.connection、Streamlit Supabase Connector(由@SiddhantSadangi开发的社区构建的连接器)以及Streamlit的Secrets management。Supabase是开源的Firebase替代方案,基于PostgreSQL。
注意
社区构建的连接,例如Streamlit Supabase Connector,扩展并构建在st.connection接口上,使得使用各种数据源构建Streamlit应用比以往任何时候都更加容易。这些类型的连接与内置在Streamlit中的连接完全相同,并且可以访问所有相同的功能。
Sign in to Supabase and create a project
首先,前往Supabase并使用您的GitHub注册一个免费账户。

使用GitHub登录

授权 Supabase
登录后,您可以创建一个项目。

您的Supabase账户

创建一个新项目
一旦您的项目创建完成,您的屏幕应该看起来像这样:

重要
请确保记下上述截图中高亮显示的项目API密钥和项目URL。☝️
你需要这些来从Streamlit连接到你的Supabase实例。
Create a Supabase database
现在你有了一个项目,你可以创建一个数据库并用一些示例数据填充它。为此,请在同一项目页面上点击SQL编辑器按钮,然后在SQL编辑器中点击新建查询按钮。

打开SQL编辑器

创建一个新查询
在SQL编辑器中,输入以下查询以创建一个数据库和一个包含一些示例值的表:
CREATE TABLE mytable (
name varchar(80),
pet varchar(80)
);
INSERT INTO mytable VALUES ('Mary', 'dog'), ('John', 'cat'), ('Robert', 'bird');
点击运行以执行查询。要验证查询是否成功执行,请点击左侧菜单上的表格编辑器按钮,然后查看你新创建的表格mytable。

编写并运行您的查询

在表格编辑器中查看您的表格
创建了您的Supabase数据库后,您现在可以从Streamlit连接到它!
Add Supabase Project URL and API key to your local app secrets
您的本地 Streamlit 应用程序将从应用程序根目录中的文件 .streamlit/secrets.toml 读取密钥。如果此文件尚不存在,请创建此文件并在此处添加 SUPABASE_URL 和 SUPABASE_KEY:
# .streamlit/secrets.toml
[connections.supabase]
SUPABASE_URL = "xxxx"
SUPABASE_KEY = "xxxx"
将上面的xxxx替换为您的项目URL和来自步骤1的API密钥。
重要
将此文件添加到.gitignore,不要将其提交到您的GitHub仓库!
Copy your app secrets to the cloud
由于上面的secrets.toml文件没有提交到GitHub,你需要将其内容单独传递给你部署的应用程序(在Streamlit社区云上)。转到应用程序仪表板,在应用程序的下拉菜单中,点击编辑Secrets。将secrets.toml的内容复制到文本区域。更多信息可在Secrets管理中找到。

Add st-supabase-connection to your requirements file
将st-supabase-connection社区构建的连接库添加到您的requirements.txt文件中,最好固定其版本(将x.x.x替换为您想要安装的版本):
# requirements.txt
st-supabase-connection==x.x.x
提示
我们在这里使用了st-supabase-connection库与st.connection结合,以利用设置数据连接的便利性、管理您的凭据以及Streamlit的缓存功能,这些功能由原生和社区构建的连接提供。
然而,如果您愿意,仍然可以直接使用Supabase Python Client Library库,但您需要编写更多代码来设置连接并缓存结果。请参阅下面的使用Supabase Python Client Library以获取示例。
Write your Streamlit app
将下面的代码复制到您的Streamlit应用程序中并运行它。
# streamlit_app.py
import streamlit as st
from st_supabase_connection import SupabaseConnection
# Initialize connection.
conn = st.connection("supabase",type=SupabaseConnection)
# Perform query.
rows = conn.query("*", table="mytable", ttl="10m").execute()
# Print results.
for row in rows.data:
st.write(f"{row['name']} has a :{row['pet']}:")
看到上面的st.connection了吗?它处理秘密检索、设置、查询缓存和重试。默认情况下,query()的结果会被缓存且不会过期。在这种情况下,我们设置ttl="10m"以确保查询结果的缓存时间不超过10分钟。你也可以设置ttl=0来禁用缓存。了解更多信息,请访问Caching。
如果一切顺利(并且你使用了我们上面创建的示例表),你的应用程序应该看起来像这样:

由于Supabase底层使用PostgresSQL,您也可以通过使用Supabase在设置 > 数据库下提供的连接字符串来连接到Supabase。从那里,您可以参考PostgresSQL教程来连接到您的数据库。
Using the Supabase Python Client Library
如果您更喜欢直接使用Supabase Python客户端库,您可以按照以下步骤操作。
-
将您的Supabase项目URL和API密钥添加到本地应用程序的机密文件中:
您的本地Streamlit应用程序将从应用程序根目录中的
.streamlit/secrets.toml文件读取机密信息。如果此文件尚不存在,请创建它,并在此处添加SUPABASE_URL和SUPABASE_KEY:# .streamlit/secrets.toml SUPABASE_URL = "xxxx" SUPABASE_KEY = "xxxx" -
将
supabase添加到你的需求文件中:将
supabasePython 客户端库添加到你的requirements.txt文件中,最好固定其版本(将x.x.x替换为你想要安装的版本):# requirements.txt supabase==x.x.x -
编写您的Streamlit应用程序:
将以下代码复制到您的Streamlit应用程序中并运行它。
# streamlit_app.py import streamlit as st from supabase import create_client, Client # 初始化连接。 # 使用st.cache_resource只运行一次。 @st.cache_resource def init_connection(): url = st.secrets["SUPABASE_URL"] key = st.secrets["SUPABASE_KEY"] return create_client(url, key) supabase = init_connection() # 执行查询。 # 使用st.cache_data仅在查询更改或10分钟后重新运行。 @st.cache_data(ttl=600) def run_query(): return supabase.table("mytable").select("*").execute() rows = run_query() # 打印结果。 for row in rows.data: st.write(f"{row['name']} has a :{row['pet']}:")看到上面的
st.cache_data了吗?如果没有它,Streamlit每次重新运行应用程序时都会运行查询(例如在小部件交互时)。使用st.cache_data,它仅在查询更改或10分钟后运行(这就是ttl的作用)。注意:如果您的数据库更新更频繁,您应该调整ttl或删除缓存,以便查看者始终看到最新数据。了解更多信息,请访问Caching。
还有问题吗?
我们的 论坛 充满了有用的信息和Streamlit专家。