Connect Streamlit to Supabase

本指南解释了如何从Streamlit社区云安全地访问Supabase实例。它使用了st.connectionStreamlit Supabase Connector(由@SiddhantSadangi开发的社区构建的连接器)以及Streamlit的Secrets management。Supabase是开源的Firebase替代方案,基于PostgreSQL。

push_pin

注意

社区构建的连接,例如Streamlit Supabase Connector,扩展并构建在st.connection接口上,使得使用各种数据源构建Streamlit应用比以往任何时候都更加容易。这些类型的连接与内置在Streamlit中的连接完全相同,并且可以访问所有相同的功能。

首先,前往Supabase并使用您的GitHub注册一个免费账户。

使用GitHub登录

授权 Supabase

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

您的Supabase账户

创建一个新项目

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

priority_high

重要

请确保记下上述截图中高亮显示的项目API密钥和项目URL。☝️

你需要这些来从Streamlit连接到你的Supabase实例。

现在你有了一个项目,你可以创建一个数据库并用一些示例数据填充它。为此,请在同一项目页面上点击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连接到它!

您的本地 Streamlit 应用程序将从应用程序根目录中的文件 .streamlit/secrets.toml 读取密钥。如果此文件尚不存在,请创建此文件并在此处添加 SUPABASE_URLSUPABASE_KEY

# .streamlit/secrets.toml [connections.supabase] SUPABASE_URL = "xxxx" SUPABASE_KEY = "xxxx"

将上面的xxxx替换为您的项目URL和来自步骤1的API密钥。

priority_high

重要

将此文件添加到.gitignore,不要将其提交到您的GitHub仓库!

由于上面的secrets.toml文件没有提交到GitHub,你需要将其内容单独传递给你部署的应用程序(在Streamlit社区云上)。转到应用程序仪表板,在应用程序的下拉菜单中,点击编辑Secrets。将secrets.toml的内容复制到文本区域。更多信息可在Secrets管理中找到。

Secrets manager screenshot

st-supabase-connection社区构建的连接库添加到您的requirements.txt文件中,最好固定其版本(将x.x.x替换为您想要安装的版本):

# requirements.txt st-supabase-connection==x.x.x
star

提示

我们在这里使用了st-supabase-connection库与st.connection结合,以利用设置数据连接的便利性、管理您的凭据以及Streamlit的缓存功能,这些功能由原生和社区构建的连接提供。

然而,如果您愿意,仍然可以直接使用Supabase Python Client Library库,但您需要编写更多代码来设置连接并缓存结果。请参阅下面的使用Supabase Python Client Library以获取示例。

将下面的代码复制到您的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

如果一切顺利(并且你使用了我们上面创建的示例表),你的应用程序应该看起来像这样:

Finished app screenshot

由于Supabase底层使用PostgresSQL,您也可以通过使用Supabase在设置 > 数据库下提供的连接字符串来连接到Supabase。从那里,您可以参考PostgresSQL教程来连接到您的数据库。

如果您更喜欢直接使用Supabase Python客户端库,您可以按照以下步骤操作。

  1. 将您的Supabase项目URL和API密钥添加到本地应用程序的机密文件中:

    您的本地Streamlit应用程序将从应用程序根目录中的.streamlit/secrets.toml文件读取机密信息。如果此文件尚不存在,请创建它,并在此处添加SUPABASE_URL和SUPABASE_KEY:

    # .streamlit/secrets.toml SUPABASE_URL = "xxxx" SUPABASE_KEY = "xxxx"
  2. supabase 添加到你的需求文件中:

    supabase Python 客户端库添加到你的 requirements.txt 文件中,最好固定其版本(将 x.x.x 替换为你想要安装的版本):

    # requirements.txt supabase==x.x.x
  3. 编写您的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

forum

还有问题吗?

我们的 论坛 充满了有用的信息和Streamlit专家。