Files
ChouJuGEO/docs/guides/STORAGE_GUIDE.md
T
刘国栋 8f7f082c3d feat: 重构项目结构并添加平台同步基础架构
- 重构项目目录结构,将功能模块移至 modules/ 目录
- 创建平台同步基础架构,包括发布器基类和 GitHub 发布器
- 新增 UI 状态管理模块 (modules/ui/state.py) 统一管理会话状态
- 更新依赖配置,添加平台同步所需依赖 (httpx, pyperclip)
- 整理文档结构,将所有文档分类移至 docs/ 目录
- 添加 .cursorrules 文件定义项目开发规范
- 清理根目录重复文件,保持项目结构整洁
2026-01-30 10:21:29 +08:00

5.0 KiB
Raw Blame History

数据持久化方案对比

为什么不能用 IndexedDB

IndexedDB 是浏览器 API,只能在 JavaScript 前端使用。
Streamlit 是 Python 后端应用,运行在服务器端,无法使用 IndexedDB。


方案对比

方案1SQLite 推荐)

优点:

  • Python 内置支持(sqlite3),无需安装额外依赖
  • 单文件数据库,易于备份和迁移
  • 查询性能好,支持复杂查询
  • 支持事务,数据安全
  • 支持 SQL 查询,灵活强大
  • 适合 MVP 到生产环境的平滑升级

缺点:

  • ⚠️ 需要学习基本的 SQL(但很简单)
  • ⚠️ 多进程写入需要处理锁(Streamlit 单进程,无此问题)

代码复杂度: (非常简单)

适用场景: MVP 和生产环境都适用


方案2JSON 文件

优点:

  • 最简单,无需学习 SQL
  • 人类可读,易于调试
  • 无需数据库知识

缺点:

  • 查询性能差(需要加载整个文件)
  • 数据量大时很慢
  • 并发写入可能丢失数据
  • 不支持复杂查询

代码复杂度: (极简单)

适用场景: 仅适合数据量很小(<1000条)的 MVP


推荐方案:SQLite

为什么推荐 SQLite

  1. 其实很简单:只需要几行代码

    import sqlite3
    conn = sqlite3.connect('data.db')
    cursor = conn.cursor()
    cursor.execute("INSERT INTO table VALUES (?)", (value,))
    conn.commit()
    conn.close()
    
  2. 性能好:即使数据量增长到几万条,依然很快

  3. 功能强大:支持统计、查询、分析,为后续功能扩展打好基础

  4. 零依赖Python 内置,无需安装任何包


快速开始

1. 使用已封装好的 DataStorage 类

我已经为你创建了 modules/data_storage.py,提供了统一的接口:

from data_storage import DataStorage

# 初始化(SQLite方式)
storage = DataStorage(storage_type="sqlite", db_path="geo_data.db")

# 保存关键词
storage.save_keywords(["关键词1", "关键词2"], "品牌名")

# 获取关键词
keywords = storage.get_keywords("品牌名")

# 保存文章
storage.save_article("关键词", "平台", "内容", "文件名", "品牌名")

# 获取统计数据
stats = storage.get_stats("品牌名")

2. 最小改动集成

modules/geo_tool.py 中,只需要在关键位置添加几行保存代码:

# 文件顶部
from data_storage import DataStorage
storage = DataStorage(storage_type="sqlite", db_path="geo_data.db")

# 关键词生成后(约第533行)
if cleaned:
    st.session_state.keywords = cleaned
    storage.save_keywords(cleaned, brand)  # 新增这一行
    st.success(f"生成完成({len(cleaned)} 条)")

# 内容生成后(约第714行)
st.session_state.generated_contents = contents
storage.save_article(keyword, plat, content, filename, brand)  # 在循环中添加

# 优化后(约第838行)
st.session_state.optimized_article = optimized_article
storage.save_optimization(
    original_article, optimized_article, changes, target_platform, brand
)  # 新增

# 验证后(约第932行)
st.session_state.verify_combined = combined
storage.save_verify_results(all_results)  # 新增

3. 添加历史记录查看功能(可选)

可以新增一个 Tab 来查看历史数据:

tab5 = st.tabs([..., "5 历史记录"])

with tab5:
    st.header("历史记录")
    
    # 统计数据
    stats = storage.get_stats(brand)
    col1, col2, col3, col4 = st.columns(4)
    col1.metric("关键词", stats["keywords_count"])
    col2.metric("文章", stats["articles_count"])
    col3.metric("优化", stats["optimizations_count"])
    col4.metric("验证", stats["verify_results_count"])
    
    # 历史文章列表
    articles = storage.get_articles(brand=brand)
    if articles:
        df = pd.DataFrame(articles)
        st.dataframe(df[["keyword", "platform", "created_at"]])

数据库文件位置

  • SQLite 文件geo_data.db(项目根目录)
  • JSON 文件data/ 目录(如果使用 JSON 方式)

建议:geo_data.db 添加到 .gitignore,避免提交到版本控制。


性能对比(参考)

数据量 SQLite JSON文件
100条 <10ms <10ms
1000条 <50ms ~100ms
10000条 ~200ms ~5秒
100000条 ~1秒 很慢

总结

对于 MVP 版本,强烈推荐使用 SQLite:

  1. 简单:使用封装好的 DataStorage 类,只需几行代码
  2. 高效:性能好,支持未来扩展
  3. 可靠:数据安全,支持事务
  4. 零依赖:Python 内置,无需安装

如果数据量真的非常小(<100条),可以考虑 JSON 文件。


下一步

  1. 查看 modules/data_storage.py 了解实现细节
  2. 查看 modules/storage_example.py 了解使用方法
  3. modules/geo_tool.py 中集成(参考上面的最小改动示例)

需要我帮你直接集成到 modules/geo_tool.py 吗?