Connect Streamlit to TiDB
Introduction
本指南解释了如何从Streamlit Community Cloud安全地访问远程TiDB数据库。它使用了st.connection和Streamlit的Secrets management。以下示例代码仅在Streamlit版本>= 1.28时有效,因为st.connection是在该版本中添加的。
TiDB 是一个开源的、兼容 MySQL 的数据库,支持混合事务和分析处理(HTAP)工作负载。TiDB 向 SQL 数据库家族引入了内置向量搜索,使您能够支持 AI 应用程序,而无需新的数据库或额外的技术栈。TiDB Cloud 是一个完全托管的云数据库服务,简化了开发者对 TiDB 数据库的部署和管理。
Sign in to TiDB Cloud and create a cluster
首先,前往TiDB Cloud并使用Google、GitHub、Microsoft或电子邮件注册一个免费账户:

一旦您登录,您将已经拥有一个TiDB集群:

如果您愿意,可以创建更多集群。点击集群名称进入集群概览页面:

然后点击连接以轻松获取访问集群的连接参数。在弹出的窗口中,点击生成密码来设置密码。

重要
请务必记下密码。在此步骤之后,它将无法在TiDB Cloud上使用。
Create a TiDB database
注意
如果您已经有一个想要使用的数据库,请随时跳到下一步。
一旦您的 TiDB 集群启动并运行,使用 mysql 客户端(或在控制台上使用 SQL Editor 标签)连接到它,并输入以下命令以创建一个数据库和一个包含一些示例值的表:
CREATE DATABASE pets;
USE pets;
CREATE TABLE mytable (
name varchar(80),
pet varchar(80)
);
INSERT INTO mytable VALUES ('Mary', 'dog'), ('John', 'cat'), ('Robert', 'bird');
Add username and password to your local app secrets
您的本地 Streamlit 应用程序将从应用程序根目录中的文件 .streamlit/secrets.toml 读取密钥。了解更多关于 Streamlit 密钥管理的信息。如果此文件尚不存在,请创建此文件,并添加您的 TiDB 集群的主机、用户名和密码,如下所示:
# .streamlit/secrets.toml
[connections.tidb]
dialect = "mysql"
host = "<TiDB_cluster_host>"
port = 4000
database = "pets"
username = "<TiDB_cluster_user>"
password = "<TiDB_cluster_password>"
重要
将您的应用程序密钥复制到Streamlit Community Cloud时,请确保将host、username和password的值替换为您的远程 TiDB集群的值!
将此文件添加到.gitignore中,不要将其提交到你的GitHub仓库!
Copy your app secrets to the cloud
由于上面的secrets.toml文件没有提交到GitHub,你需要将其内容单独传递给你部署的应用程序(在Streamlit社区云上)。转到应用程序仪表板,在应用程序的下拉菜单中,点击编辑Secrets。将secrets.toml的内容复制到文本区域。更多信息可在Secrets管理中找到。

Add dependencies to your requirements file
将mysqlclient和SQLAlchemy包添加到您的requirements.txt文件中,最好固定其版本(将x.x.x替换为您想要安装的版本):
# requirements.txt
mysqlclient==x.x.x
SQLAlchemy==x.x.x
Write your Streamlit app
将下面的代码复制到您的Streamlit应用程序中并运行它。确保调整query以使用您的表名。
# streamlit_app.py
import streamlit as st
# Initialize connection.
conn = st.connection('tidb', type='sql')
# Perform query.
df = conn.query('SELECT * from mytable;', ttl=600)
# Print results.
for row in df.itertuples():
st.write(f"{row.name} has a :{row.pet}:")
看到上面的st.connection了吗?它处理密钥检索、设置、查询缓存和重试。默认情况下,query()的结果会被缓存且不会过期。在这种情况下,我们设置了ttl=600以确保查询结果的缓存时间不超过10分钟。你也可以设置ttl=0来禁用缓存。了解更多信息,请访问Caching。
如果一切顺利(并且你使用了我们上面创建的示例表),你的应用程序应该看起来像这样:

Connect with PyMySQL
除了mysqlclient,PyMySQL是另一个流行的MySQL Python客户端。要使用PyMySQL,首先你需要调整你的需求文件:
# requirements.txt
PyMySQL==x.x.x
SQLAlchemy==x.x.x
然后调整你的密钥文件:
# .streamlit/secrets.toml
[connections.tidb]
dialect = "mysql"
driver = "pymysql"
host = "<TiDB_cluster_host>"
port = 4000
database = "pets"
username = "<TiDB_cluster_user>"
password = "<TiDB_cluster_password>"
create_engine_kwargs = { connect_args = { ssl = { ca = "<path_to_CA_store>" }}}
还有问题吗?
我们的 论坛 充满了有用的信息和Streamlit专家。