Connect Streamlit to Microsoft SQL Server
Introduction
本指南解释了如何从Streamlit Community Cloud安全地访问远程Microsoft SQL Server数据库。它使用了pyodbc库和Streamlit的Secrets management。
Create an SQL Server database
注意
如果您已经有一个想要使用的远程数据库,请随时跳到下一步。
首先,按照微软文档安装SQL Server和sqlcmd
Utility。他们有详细的安装指南,说明如何:
安装SQL Server后,请记下安装过程中设置的SQL Server名称、用户名和密码。
Connect locally
如果您正在本地连接,请使用 sqlcmd
连接到您的新本地 SQL Server 实例。
-
在您的终端中,运行以下命令:
sqlcmd -S localhost -U SA -P '
' 由于您是本地连接,SQL Server 名称是
localhost
,用户名是SA
,密码是您在 SA 账户设置期间提供的密码。 -
如果成功,你应该会看到一个sqlcmd命令提示符
1>
。
提示
远程连接时,SQL Server 名称是机器名称或 IP 地址。您可能还需要在防火墙上打开 SQL Server TCP 端口(默认 1433)。
Create a SQL Server database
到目前为止,您已经运行了SQL Server并使用sqlcmd
连接到它!🥳 让我们通过创建一个包含带有一些示例值的表的数据库来使用它。
-
从
sqlcmd
命令提示符中,运行以下 Transact-SQL 命令以创建测试数据库mydb
:CREATE DATABASE mydb
-
要执行上述命令,请在新的一行输入
GO
:GO
Insert some data
接下来在mydb
数据库中创建一个新表mytable
,包含三列和两行。
-
切换到新的
mydb
数据库:USE mydb
-
创建一个具有以下模式的新表:
CREATE TABLE mytable (name varchar(80), pet varchar(80))
-
向表中插入一些数据:
INSERT INTO mytable VALUES ('Mary', 'dog'), ('John', 'cat'), ('Robert', 'bird')
-
输入
GO
来执行上述命令:GO
要结束您的sqlcmd会话,请在新行上输入QUIT
。
Add username and password to your local app secrets
您的本地 Streamlit 应用程序将从应用程序根目录中的文件 .streamlit/secrets.toml
读取密钥。如果该文件尚不存在,请创建此文件,并添加 SQL Server 名称、数据库名称、用户名和密码,如下所示:
# .streamlit/secrets.toml
server = "localhost"
database = "mydb"
username = "SA"
password = "xxx"
重要
将您的应用程序密钥复制到Streamlit Community Cloud时,请确保将server、database、username和password的值替换为您的远程 SQL Server的值!
并将此文件添加到.gitignore
中,不要将其提交到您的GitHub仓库。
Copy your app secrets to Streamlit Community Cloud
由于上面的secrets.toml
文件没有提交到GitHub,你需要将其内容单独传递给你部署的应用程序(在Streamlit社区云上)。转到应用程序仪表板,在应用程序的下拉菜单中,点击编辑Secrets。将secrets.toml
的内容复制到文本区域。更多信息可在Secrets管理中找到。

Add pyodbc to your requirements file
要使用Streamlit本地连接到SQL Server,除了在SQL Server安装过程中安装的Microsoft ODBC驱动程序外,你还需要pip install pyodbc
。
在Streamlit Cloud上,我们内置了对SQL Server的支持。根据广泛的需求,我们直接将SQL Server工具,包括ODBC驱动程序和可执行文件sqlcmd
和bcp
,添加到云应用的容器镜像中,因此您无需安装它们。
你只需要将pyodbc
Python包添加到你的requirements.txt
文件中,就可以开始了!🎈
# requirements.txt
pyodbc==x.x.x
将 x.x.x
☝️ 替换为您希望在 Cloud 上安装的 pyodbc 版本。
注意
目前,Streamlit Community Cloud 不支持 Azure Active Directory 认证。当我们添加对 Azure Active Directory 的支持时,我们将更新本教程。
Write your Streamlit app
将下面的代码复制到您的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。
如果一切顺利(并且你使用了我们上面创建的示例表),你的应用程序应该看起来像这样:

还有问题吗?
我们的 论坛 充满了有用的信息和Streamlit专家。