Streamlit应用中数据库操作外置至db.py的实现方案问询
完全可行!这是Streamlit项目中分离业务逻辑与UI的最佳实践之一
一、推荐的文件夹结构
基础结构(小型项目)
my_streamlit_app/ ├── app.py # Streamlit主应用文件 ├── db.py # 数据库操作逻辑文件 └── requirements.txt # 依赖声明(如streamlit、sqlite3/sqlalchemy等)
扩展结构(中大型项目)
如果后续需要更多工具类,可以把数据库逻辑放到专门的工具目录:
my_streamlit_app/ ├── app.py ├── utils/ │ ├── db.py # 数据库操作 │ └── helpers.py # 其他通用工具 └── requirements.txt
二、编写db.py的示例代码
以SQLite为例(无需额外服务,适合快速测试),在db.py中封装所有数据库连接和CRUD操作:
import sqlite3 from sqlite3 import Error def create_connection(): """创建数据库连接""" conn = None try: conn = sqlite3.connect('mydatabase.db') # 本地SQLite文件 return conn except Error as e: print(e) return conn def add_user(conn, name, email): """新增用户记录""" sql = '''INSERT INTO users(name, email) VALUES(?,?)''' cur = conn.cursor() cur.execute(sql, (name, email)) conn.commit() return cur.lastrowid def get_all_users(conn): """获取所有用户记录""" cur = conn.cursor() cur.execute("SELECT * FROM users") rows = cur.fetchall() return rows # 可继续编写update_user、delete_user等CRUD函数
三、在Streamlit应用中导入并使用
在app.py中直接导入db.py的函数,专注于UI交互:
import streamlit as st from db import create_connection, add_user, get_all_users # 初始化数据库连接 conn = create_connection() # 页面UI st.title("用户管理系统") # 新增用户表单 with st.form("add_user_form"): name = st.text_input("姓名") email = st.text_input("邮箱") submitted = st.form_submit_button("添加用户") if submitted and name and email: user_id = add_user(conn, name, email) st.success(f"用户添加成功,ID: {user_id}") # 展示所有用户 st.subheader("所有用户") users = get_all_users(conn) if users: st.table(users) else: st.info("暂无用户数据")
如果是扩展结构(utils目录下的db.py),导入路径改为:
from utils.db import create_connection, add_user, get_all_users
四、关键注意事项
- 连接管理:建议使用上下文管理器(
with语句)确保数据库连接正确关闭,避免资源泄漏 - 敏感信息:不要把数据库密码、地址硬编码在代码中,可使用环境变量(如
os.getenv("DB_PASSWORD")) - 异常处理:在db.py中添加适当的异常捕获,避免数据库错误直接暴露到Streamlit UI
- 依赖隔离:在requirements.txt中明确声明所有依赖,方便部署
内容的提问来源于stack exchange,提问作者akshayranganath
相关产品推荐
相关产品推荐

