Connect Streamlit to TiDB

本指南解释了如何从Streamlit Community Cloud安全地访问远程TiDB数据库。它使用了st.connection和Streamlit的Secrets management。以下示例代码仅在Streamlit版本>= 1.28时有效,因为st.connection是在该版本中添加的。

TiDB 是一个开源的、兼容 MySQL 的数据库,支持混合事务和分析处理(HTAP)工作负载。TiDB 向 SQL 数据库家族引入了内置向量搜索,使您能够支持 AI 应用程序,而无需新的数据库或额外的技术栈。TiDB Cloud 是一个完全托管的云数据库服务,简化了开发者对 TiDB 数据库的部署和管理。

首先,前往TiDB Cloud并使用Google、GitHub、Microsoft或电子邮件注册一个免费账户:

Sign up TiDB Cloud

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

List clusters

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

Cluster overview

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

Get connection arguments
priority_high

重要

请务必记下密码。在此步骤之后,它将无法在TiDB Cloud上使用。

push_pin

注意

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

一旦您的 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');

您的本地 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>"
priority_high

重要

将您的应用程序密钥复制到Streamlit Community Cloud时,请确保将hostusernamepassword的值替换为您的远程 TiDB集群的值!

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

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

Secrets manager screenshot

mysqlclientSQLAlchemy包添加到您的requirements.txt文件中,最好固定其版本(将x.x.x替换为您想要安装的版本):

# requirements.txt mysqlclient==x.x.x SQLAlchemy==x.x.x

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

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

Finished app screenshot

除了mysqlclientPyMySQL是另一个流行的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>" }}}
forum

还有问题吗?

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