用 Streamlit 和 SQLite 构建高效数据库管理工具 在数据驱动的开发中,数据库管理是一个不可或缺的环节。最近,我开发了一个基于 Python 的简单数据库管理工具,用于管理和展示石窟艺术数据。这个项目不仅帮助我巩固了对 Streamlit 和 SQLite 的理解,还让我体会到了快速开发工具的强大能力。
项目背景 我们的目标是创建一个简单易用的工具,用于管理和展示石窟艺术数据。这些数据存储在一个 SQLite 数据库中,包括雕塑的时期、洞窟名称、洞窟编号、来源、地区以及相关的图片等信息。为了实现这一目标,我选择了 Python 的 Streamlit 框架,因为它能够快速搭建交互式 Web 应用。
技术栈
Python :作为开发语言,简洁且功能强大。
Streamlit :用于构建交互式 Web 界面。
SQLite :轻量级数据库,适合小型项目。
功能实现 1. 数据库操作 我封装了几个关键的数据库操作函数,包括查询、插入/更新和删除记录。以下是部分代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 def query_database (period=None , cave_name=None , cave_number=None , source=None , region=None ): conn = sqlite3.connect(sqlite_db_path) cursor = conn.cursor() query = "SELECT * FROM BuddhaSculptures" params = [] conditions = [] if period: conditions.append("period = ?" ) params.append(period) if cave_name: conditions.append("cave_name = ?" ) params.append(cave_name) if cave_number: conditions.append("cave_number = ?" ) params.append(cave_number) if source: conditions.append("source = ?" ) params.append(source) if region: conditions.append("region = ?" ) params.append(region) if conditions: query += " WHERE " + " AND " .join(conditions) cursor.execute(query, params) results = cursor.fetchall() cursor.close() conn.close() return results
这些函数通过 SQLite 的 Python 接口实现了对数据库的基本操作。
2. Streamlit 界面开发 Streamlit 的界面开发非常直观。我通过简单的表单和按钮实现了查询、添加/更新和删除记录的功能。以下是部分界面代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 st.subheader("Query Records" ) period = st.text_input("Period" ) cave_name = st.text_input("Cave Name" ) if st.button("Query" ): results = query_database(period, cave_name, cave_number, source, region) if results: st.write(f"Found {len (results)} results:" ) for row in results: st.write(f"ID: {row[0 ]} , Period: {row[5 ]} , Cave Name: {row[3 ]} " ) image_data = row[-1 ] image = display_image_from_blob(image_data) if image: st.image(image, caption=f"Image ID: {row[0 ]} " , use_container_width=True ) else : st.write("No image available." ) else : st.write("No results found." )
通过 Streamlit 提供的组件,如 st.text_input 和 st.button,用户可以轻松进行数据查询。
3. 图片处理 为了支持图片的上传和展示,我使用了 Pillow 库来处理图片数据,并将其以 BLOB 格式存储在数据库中。以下是图片展示的代码:
1 2 3 4 5 6 7 def display_image_from_blob (blob_data ): if blob_data: image_bytes = io.BytesIO(blob_data) image = Image.open (image_bytes) return image else : return None
通过这种方式,用户可以方便地上传图片,并在查询时直接查看图片内容。
项目运行 为了方便启动项目,我编写了一个启动脚本 db_start_streamlit.py,它会检查环境变量,确保 Streamlit 只运行一次。以下是启动脚本的核心代码:
1 2 3 4 5 6 if __name__ == "__main__" : if os.environ.get(ENV_FLAG) is None : os.environ[ENV_FLAG] = "1" os.system("streamlit run db_streamlit.py" ) else : print ("Streamlit is already running." )
通过这个脚本,用户只需运行一个命令即可启动整个应用。
总结 通过这个项目,我不仅巩固了 Python 和 SQLite 的开发技能,还学习了如何使用 Streamlit 构建简单的 Web 应用。这个工具虽然简单,但已经能够满足我们对石窟艺术数据的基本管理需求。未来,我计划进一步优化界面设计,并尝试将数据迁移到更强大的数据库系统中,以支持更大的数据量和更复杂的查询。
如果你对这个项目感兴趣,或者有类似的开发需求,欢迎与我交流!
附录