Connect Streamlit to Snowflake

本指南解释了如何从Streamlit安全地访问Snowflake数据库。它使用了st.connectionSnowpark库以及Streamlit的Secrets管理

  • 您的Python环境中必须安装以下包:

    streamlit>=1.28 snowflake-snowpark-python>=0.9.0 snowflake-connector-python>=2.8.0
    push_pin

    注意

    使用snowflake-snowpark-python所需的正确Python版本。例如,如果您使用snowflake-snowpark-python==1.23.0,则必须使用Python版本>=3.8,<3.12。

  • 您必须拥有一个Snowflake账户。要创建试用账户,请参阅入门中的教程

  • 你应该对st.connectionSecrets management有基本的了解。

如果您已经有一个想要使用的数据库,您可以跳到下一步

  1. 登录您的Snowflake账户,访问 https://app.snowflake.com

  2. 在左侧导航中,选择“项目”,然后选择“工作表”。

  3. 要创建一个新的工作表,请在右上角点击加号图标(添加)。

    您可以使用工作表快速方便地执行SQL语句。这是在试用账户中学习和实验SQL的好方法。

  4. 可选:要重命名您的工作表,请在左上角悬停在工作表名称的标签上,然后点击溢出菜单图标(more_vert)。选择“重命名”,输入新的工作表名称(例如“Scratchwork”),然后按下“Enter”。

  5. 要在工作表的SQL编辑器中创建一个带有表的新数据库,输入并执行以下SQL语句:

    CREATE DATABASE PETS; CREATE TABLE MYTABLE (NAME varchar(80), PET varchar(80)); INSERT INTO MYTABLE VALUES ('Mary', 'dog'), ('John', 'cat'), ('Robert', 'bird'); SELECT * FROM MYTABLE;

    要在工作表中执行语句,请用鼠标高亮选择所有要执行的行。然后,在右上角点击播放按钮(play_arrow)。或者,如果你想执行工作表中的所有内容,点击播放按钮旁边的向下箭头(expand_more),然后选择“全部运行”。

    AWS screenshot 1
    priority_high

    重要

    如果没有高亮任何行并且你点击了播放按钮,则只会执行光标所在的行。

  6. 可选:要查看您的新数据库,请在左侧导航上方选择“Databases”。点击向下箭头(expand_more)以展开“PETS” → “PUBLIC” → “Tables” → “MYTABLE”。

    AWS screenshot 2
  7. 为了在后续步骤中使用,请记下您的角色、仓库、数据库和模式。在前面的截图中,这些是以下内容:

    role = "ACCOUNTADMIN" warehouse = "COMPUTE_WH" database = "PETS" schema = "PUBLIC"

    因为SQL语句没有指定模式,所以它们默认为新“PETS”数据库中的“PUBLIC”模式。角色和仓库是试用账户的默认设置。您可以在右上角,Share和播放(play_arrow)按钮的左侧,看到您的工作表使用的角色和仓库。

    在Snowflake中,数据库提供存储,仓库提供计算。当您配置连接时,并不明确要求声明角色、仓库、数据库和模式;如果未指定这些内容,连接将使用您的账户默认设置。如果您想使用多个角色、仓库或数据库,您也可以在活动连接中更改这些设置。然而,声明这些默认设置可以避免无意中的选择。

  8. 为了方便复制您的账户标识符,在左下角点击您的个人资料图片,并将鼠标悬停在您的账户上。一个弹出对话框会向右展开,显示您的组织和账户。在弹出框中,将鼠标悬停在您的账户上,然后点击复制图标(content_copy)。

    剪贴板中的账户标识符是用句点分隔的,这是用于SQL语句的格式。然而,Python的Snowflake连接器需要用连字符分隔的格式。将您的账户标识符粘贴到您的笔记中,并将句点改为连字符。

    account = "xxxxxxx-xxxxxxx"

    有关更多信息,请参阅Snowflake文档中的账户标识符

Streamlit 在三个地方查找您的连接参数:st.connection 中的关键字参数、.streamlit/secrets.toml.snowflake/configuration.toml。有关更多信息,特别是如果您想管理多个连接,请参阅 SnowflakeConnnection 的 API 参考中的示例。

要配置您的连接,您必须指定以下内容:

  • 您的账户标识符 (account)
  • 您的用户名 (user)
  • 某种形式的认证参数(如 passwordprivate_key_file

如果您的账户没有启用MFA,您只需指定password。或者,您可以在账户上设置密钥对认证并指向您的private_key_file。如果您只是寻找一个快速的本地连接,您可以将authenticator设置为在外部浏览器中提示您输入凭据。

除了验证连接所需的三个参数外,通常为了方便起见,还会指定默认的rolewarehousedatabaseschema。有关必需和可选参数的更多信息,请参阅Snowflake Connector for Python文档。

  1. 如果你的应用程序工作目录中还没有.streamlit/secrets.toml文件,请创建一个空的secrets文件。

    要了解更多信息,请参阅Secrets Management

    priority_high

    重要

    将此文件添加到.gitignore中,并且不要将其提交到你的GitHub仓库!如果你想在多个仓库中使用此连接,你可以创建一个全局的secrets.toml文件。更多信息,请参阅secrets.toml文件位置

  2. 将您的连接参数添加到 .streamlit/secrets.toml 中:

    [connections.snowflake] account = "xxxxxxx-xxxxxxx" user = "xxx" private_key_file = "../xxx/xxx.p8" role = "xxx" warehouse = "xxx" database = "xxx" schema = "xxx"
    priority_high

    重要

    您的账户标识符必须用连字符分隔:-。这是通用标识符格式,而不是 SQL 语句中使用的点分隔格式。

    在上面的示例中,连接使用了密钥对认证。因此,定义了 private_key_file 而不是 passwordprivate_key_file 可以是绝对路径或相对路径。如果您使用相对路径,它应该相对于您的应用程序的工作目录(即您执行 streamlit run 的目录)。

如果您已经使用Snowflake的连接文件配置了连接,您可以按原样使用它。如果您使用的是默认连接,则在本教程的后续步骤中无需更改。如果您使用的是命名连接,则需要在st.connection中包含名称。这将在后续步骤中说明。有关使用命名连接的信息,请参阅SnowflakeConnnection的API参考中的示例。

  1. 如果您的用户目录中还没有.snowflake/configuration.toml文件,请创建一个空的连接文件。

  2. 将您的连接参数添加到 .snowflake/connection.toml 文件中:

    [default] account = "xxxxxxx-xxxxxxx" user = "xxx" private_key_file = "../xxx/xxx.p8" role = "xxx" warehouse = "xxx" database = "xxx" schema = "xxx"

    此示例使用前面选项中描述的密钥对认证。

  1. 将以下代码复制到您的Streamlit应用程序中并保存。如果您没有使用本教程第一部分中的示例数据库和表,请根据需要替换SQL查询和结果处理。

    # streamlit_app.py import streamlit as st conn = st.connection("snowflake") df = conn.query("SELECT * FROM mytable;", ttl="10m") for row in df.itertuples(): st.write(f"{row.NAME} has a :{row.PET}:")

    st.connection命令创建一个SnowflakeConnection对象并处理密钥检索。.query()方法处理查询缓存和重试。默认情况下,查询结果会被缓存且不会过期。设置ttl="10m"确保查询结果缓存不超过10分钟。要禁用缓存,可以设置ttl=0。了解更多信息,请参阅Caching

    push_pin

    注意

    如果您使用.snowflake/connections.toml中的命名连接而不是[default](上述选项2)配置了连接,则必须在st.connection中包含您的连接名称。如果您的连接文件中有[my_connection],请将st.connection行替换为以下内容:

    conn = st.connection("my_connection", type="snowflake")
  2. 在您的工作目录中,打开终端并运行您的Streamlit应用程序。

    streamlit run streamlit_app.py

    如果一切顺利(并且您使用了第一节中的示例表格),您的应用程序应该看起来像这样:

    Finished app screenshot

上面使用的SnowflakeConnection还提供了对Snowpark sessions的访问,用于在Snowflake内部原生运行的数据框风格操作。使用这种方法,你可以将上面的应用程序重写如下:

# streamlit_app.py import streamlit as st conn = st.connection("snowflake") @st.cache_data def load_table(): session = conn.session() return session.table("mytable").to_pandas() df = load_table() for row in df.itertuples(): st.write(f"{row.NAME} has a :{row.PET}:")

因为这个例子使用了.session()而不是.query(),所以手动添加了缓存以提高性能和效率。

如果一切顺利(并且你使用了第一部分中的示例表),你的应用程序应该看起来与前面的截图相同。

本教程假设使用本地Streamlit应用程序,但您也可以从托管在Community Cloud中的应用程序连接到Snowflake。主要附加步骤如下:

  • 包含依赖项信息 使用一个 requirements.txt 文件,其中包含 snowflake-snowpark-python 和其他任何依赖项。
  • Add your secrets 到你的社区云应用程序中。你必须使用上面选项1中描述的.streamlit/secrets.toml格式。
forum

还有问题吗?

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