Python Streamlit连接SQL Server实现关联selectbox下拉菜单开发咨询
实现方案
Streamlit天然支持组件联动,核心逻辑为:任意组件值变更时,整个页面脚本会从上到下重新执行,你只需将后级下拉框的查询逻辑增加前级下拉框选中值作为过滤条件即可。
修改后可直接运行的代码
import streamlit as st import re # 此处保留你原有数据库连接初始化逻辑,保证cursor变量可正常调用即可 patternt = r"(?<=')[^,]+?(?=')" # 第一个下拉框:全量查询街道,逻辑保持不变 query_street = r"select distinct street from dbo.info" rows_street = cursor.execute(query_street).fetchall() rows_street = re.findall(patternt, " ".join([str(s) for s in rows_street])) street_input = st.selectbox("选择街道", rows_street) # 第二个下拉框:基于选中的街道过滤查询所属楼栋 query_building = r"select distinct building from dbo.info where street = ?" # 用参数化查询传参,避免SQL注入风险 rows_building = cursor.execute(query_building, (street_input,)).fetchall() rows_building = re.findall(patternt, " ".join([str(s) for s in rows_building])) # 无匹配数据兜底,避免页面报错 if not rows_building: st.warning("当前街道下暂无匹配楼栋") st.stop() building_input = st.selectbox("选择楼栋", rows_building) # 第三个下拉框:基于选中的街道和楼栋过滤查询第三个字段(示例字段为room,自行替换为实际字段名) query_third = r"select distinct 你的第三个字段名 from dbo.info where street = ? and building = ?" rows_third = cursor.execute(query_third, (street_input, building_input)).fetchall() rows_third = re.findall(patternt, " ".join([str(s) for s in rows_third])) if not rows_third: st.warning("当前楼栋下暂无匹配数据") st.stop() third_input = st.selectbox("选择对应字段", rows_third)
额外说明
- 请将代码中的
你的第三个字段名替换为实际表中第三个下拉框对应的字段名称 - 原有代码中building相关变量存在拼写错误,修改后的代码已修正
- 如果数据量不大,可以首次加载时一次性拉取全量关联数据存为字典,后续直接从内存过滤选项,减少数据库查询次数,运行效率更高
内容的提问来源于stack exchange,提问作者DevLeb2022
相关产品推荐
相关产品推荐

