Connect Streamlit to Microsoft SQL Server

本指南解释了如何从Streamlit Community Cloud安全地访问远程Microsoft SQL Server数据库。它使用了pyodbc库和Streamlit的Secrets management

push_pin

注意

如果您已经有一个想要使用的远程数据库,请随时跳到下一步

首先,按照微软文档安装SQL Serversqlcmd Utility。他们有详细的安装指南,说明如何:

安装SQL Server后,请记下安装过程中设置的SQL Server名称、用户名和密码。

如果您正在本地连接,请使用 sqlcmd 连接到您的新本地 SQL Server 实例。

  1. 在您的终端中,运行以下命令:

    sqlcmd -S localhost -U SA -P ''

    由于您是本地连接,SQL Server 名称是 localhost,用户名是 SA,密码是您在 SA 账户设置期间提供的密码。

  2. 如果成功,你应该会看到一个sqlcmd命令提示符1>

  3. 如果遇到连接失败,请查看微软针对您操作系统的连接故障排除建议(Linux & Windows)。

star

提示

远程连接时,SQL Server 名称是机器名称或 IP 地址。您可能还需要在防火墙上打开 SQL Server TCP 端口(默认 1433)。

到目前为止,您已经运行了SQL Server并使用sqlcmd连接到它!🥳 让我们通过创建一个包含带有一些示例值的表的数据库来使用它。

  1. sqlcmd 命令提示符中,运行以下 Transact-SQL 命令以创建测试数据库 mydb

    CREATE DATABASE mydb
  2. 要执行上述命令,请在新的一行输入 GO

    GO

接下来在mydb数据库中创建一个新表mytable,包含三列和两行。

  1. 切换到新的 mydb 数据库:

    USE mydb
  2. 创建一个具有以下模式的新表:

    CREATE TABLE mytable (name varchar(80), pet varchar(80))
  3. 向表中插入一些数据:

    INSERT INTO mytable VALUES ('Mary', 'dog'), ('John', 'cat'), ('Robert', 'bird')
  4. 输入 GO 来执行上述命令:

    GO

要结束您的sqlcmd会话,请在新行上输入QUIT

您的本地 Streamlit 应用程序将从应用程序根目录中的文件 .streamlit/secrets.toml 读取密钥。如果该文件尚不存在,请创建此文件,并添加 SQL Server 名称、数据库名称、用户名和密码,如下所示:

# .streamlit/secrets.toml server = "localhost" database = "mydb" username = "SA" password = "xxx"
priority_high

重要

将您的应用程序密钥复制到Streamlit Community Cloud时,请确保将serverdatabaseusernamepassword的值替换为您的远程 SQL Server的值!

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

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

Secrets manager screenshot

要使用Streamlit本地连接到SQL Server,除了在SQL Server安装过程中安装的Microsoft ODBC驱动程序外,你还需要pip install pyodbc

Streamlit Cloud上,我们内置了对SQL Server的支持。根据广泛的需求,我们直接将SQL Server工具,包括ODBC驱动程序和可执行文件sqlcmdbcp,添加到云应用的容器镜像中,因此您无需安装它们。

你只需要将pyodbc Python包添加到你的requirements.txt文件中,就可以开始了!🎈

# requirements.txt pyodbc==x.x.x

x.x.x ☝️ 替换为您希望在 Cloud 上安装的 pyodbc 版本。

push_pin

注意

目前,Streamlit Community Cloud 不支持 Azure Active Directory 认证。当我们添加对 Azure Active Directory 的支持时,我们将更新本教程。

将下面的代码复制到您的Streamlit应用程序中并运行它。确保调整query以使用您的表名。

import streamlit as st import pyodbc # Initialize connection. # Uses st.cache_resource to only run once. @st.cache_resource def init_connection(): return pyodbc.connect( "DRIVER={ODBC Driver 17 for SQL Server};SERVER=" + st.secrets["server"] + ";DATABASE=" + st.secrets["database"] + ";UID=" + st.secrets["username"] + ";PWD=" + st.secrets["password"] ) conn = init_connection() # Perform query. # Uses st.cache_data to only rerun when the query changes or after 10 min. @st.cache_data(ttl=600) def run_query(query): with conn.cursor() as cur: cur.execute(query) return cur.fetchall() rows = run_query("SELECT * from mytable;") # Print results. for row in rows: st.write(f"{row[0]} has a :{row[1]}:")

看到上面的st.cache_data了吗?如果没有它,Streamlit 每次重新运行应用程序时(例如在小部件交互时)都会运行查询。有了st.cache_data,它只会在查询更改或10分钟后运行(这就是ttl的作用)。注意:如果你的数据库更新更频繁,你应该调整ttl或移除缓存,以便观众始终看到最新的数据。了解更多信息,请访问Caching

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

Finished app screenshot
forum

还有问题吗?

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