Files
mkdocs/docs/Obsidian笔记体系/Projects/aitsc/wk2.md
2026-05-11 00:31:26 +08:00

8.6 KiB
Raw Blame History

● 根据分析,promptsTemplates.py 的数据迁移确实是一个重要的中优先级改进。以下是详细的迁移方案和实施步骤:

📊 当前问题分析

promptsTemplates.py 的主要问题:

  1. 安全漏洞:包含硬编码数据库密码(腾讯云:!Rjb12191,本地:123456)
  2. 数据与代码混合:144KB 文件中约 4000 行是模板数据
  3. 不规范的数据库连接:使用 pymysql 直接连接,而不是项目的 SQLAlchemy ORM
  4. 冗余功能:既是数据存储又是初始化脚本

✅ 有利条件:

  • 应用已通过 PromptTemplate.query 从数据库获取模板
  • PromptTemplate 模型已在 models.py 中定义
  • 项目已有完整的数据库迁移系统 (migrations/ 目录)
  • 新的配置系统已就位

🎯 迁移实施计划

阶段一:数据提取和备份(30分钟)

  1. 提取模板数据到 JSON

创建数据目录

mkdir -p /d/aaa/aitsc/data

手动或编写脚本提取 templates 列表到 JSON

将生成:data/prompt_templates.json

  1. 备份现有数据库中的模板数据

创建备份脚本

from src.flask_prompt_master import create_app, db from src.flask_prompt_master.models.models import PromptTemplate import json

app = create_app() with app.app_context(): templates = PromptTemplate.query.all() data = [{ 'name': t.name, 'description': t.description, 'category': t.category, 'industry': t.industry, 'profession': t.profession, 'sub_category': t.sub_category, 'system_prompt': t.system_prompt, 'is_default': t.is_default } for t in templates]

  with open('data/existing_templates_backup.json', 'w', encoding='utf-8') as f:
      json.dump(data, f, ensure_ascii=False, indent=2)

阶段二:创建安全初始化系统(45分钟)

  1. 创建新的初始化脚本

scripts/init_prompt_templates.py

import json import os from dotenv import load_dotenv from src.flask_prompt_master import create_app, db from src.flask_prompt_master.models.models import PromptTemplate

load_dotenv()

def init_from_json(json_file='data/prompt_templates.json'): """从JSON文件安全初始化模板数据""" app = create_app() with app.app_context(): # 检查数据库连接 if not db.session.bind: raise ValueError("数据库连接未初始化")

      # 加载模板数据
      with open(json_file, 'r', encoding='utf-8') as f:
          templates_data = json.load(f)

      added_count = 0
      skipped_count = 0

      for template_data in templates_data:
          # 检查是否已存在同名模板
          existing = PromptTemplate.query.filter_by(
              name=template_data['name']
          ).first()

          if not existing:
              template = PromptTemplate(**template_data)
              db.session.add(template)
              added_count += 1
          else:
              skipped_count += 1

      try:
          db.session.commit()
          print(f"✅ 初始化完成:新增 {added_count} 条,跳过 {skipped_count} 条")
          return True
      except Exception as e:
          db.session.rollback()
          print(f"❌ 初始化失败:{e}")
          return False

if name == 'main': init_from_json()

  1. 更新 promptsTemplates.py(保留向后兼容)

在 promptsTemplates.py 顶部添加

import warnings warnings.warn( "promptsTemplates.py 已弃用,请使用 scripts/init_prompt_templates.py", DeprecationWarning )

修改 init_db 函数,移除硬编码密码,调用新的初始化脚本

def init_db(database_type='local'): """向后兼容的初始化函数(重定向到新系统)""" print("⚠️ 此函数已弃用,请使用新的初始化系统") print("💡 运行: python scripts/init_prompt_templates.py") # 或者直接调用新脚本 from scripts.init_prompt_templates import init_from_json return init_from_json()

阶段三:环境配置和安全加固(30分钟)

  1. 更新 .env.example 文件

移除真实凭据,使用占位符

DATABASE_URL=mysql+pymysql://username:password@host:port/database_name?charset=utf8mb4 LLM_API_KEY=sk-your-api-key-here WX_SECRET=your-wx-secret-here

  1. 确保 .env 不被提交

检查 .gitignore

echo ".env" >> /d/aaa/aitsc/.gitignore echo ".env." >> /d/aaa/aitsc/.gitignore echo "!.example" >> /d/aaa/aitsc/.gitignore

  1. 创建部署说明文档

模板数据初始化说明

新系统使用

  1. 复制环境变量模板:cp .env.example .env
  2. 编辑 .env 文件,填入真实凭据
  3. 初始化模板数据:python scripts/init_prompt_templates.py

旧系统兼容

旧命令 python src/flask_prompt_master/promptsTemplates.py [local|tencent] 将自动重定向到新系统。

阶段四:测试和验证(30分钟)

  1. 测试脚本

tests/test_template_init.py

import pytest from scripts.init_prompt_templates import init_from_json from src.flask_prompt_master.models.models import PromptTemplate

def test_template_count(): """测试模板数量是否正确""" init_from_json('tests/test_templates.json') count = PromptTemplate.query.count() assert count > 0

def test_no_duplicates(): """测试不会创建重复模板""" init_from_json('tests/test_templates.json') count1 = PromptTemplate.query.count() init_from_json('tests/test_templates.json') # 再次运行 count2 = PromptTemplate.query.count() assert count1 == count2 # 数量应不变

📅 实施时间表

┌──────┬────────────────┬──────────┬────────┐ │ 阶段 │ 任务 │ 预计时间 │ 优先级 │ ├──────┼────────────────┼──────────┼────────┤ │ 1 │ 数据提取和备份 │ 30分钟 │ 高 │ ├──────┼────────────────┼──────────┼────────┤ │ 2 │ 安全初始化脚本 │ 45分钟 │ 高 │ ├──────┼────────────────┼──────────┼────────┤ │ 3 │ 环境配置加固 │ 30分钟 │ 高 │ ├──────┼────────────────┼──────────┼────────┤ │ 4 │ 测试验证 │ 30分钟 │ 中 │ ├──────┼────────────────┼──────────┼────────┤ │ 5 │ 文档更新 │ 15分钟 │ 中 │ ├──────┼────────────────┼──────────┼────────┤ │ 总计 │ │ 2.5小时 │ │ └──────┴────────────────┴──────────┴────────┘

🔧 迁移后的架构

aitsc/ ├── data/ # 数据文件目录 │ ├── prompt_templates.json # 模板数据(JSON格式) │ └── existing_templates_backup.json ├── scripts/ # 管理脚本 │ ├── init_prompt_templates.py # 安全初始化脚本 │ └── backup_templates.py ├── src/flask_prompt_master/ │ └── promptsTemplates.py # 已弃用(保留兼容) └── .env.example # 环境变量模板

⚠️ 风险和缓解措施

风险: 生产数据库已有模板数据 - 缓解: 初始化脚本检查重复,不会覆盖现有数据 风险: 依赖旧初始化流程的脚本 - 缓解: 保留 promptsTemplates.py 的兼容性包装 风险: JSON 文件可能过大 - 缓解: 可考虑分多个 JSON 文件或使用数据库种子

📝 下一步建议

立即行动: 8. 先备份现有数据库中的模板数据 9. 提取当前 promptsTemplates.py 中的模板到 JSON 10. 创建安全初始化脚本

验证后: 11. 在测试环境运行新系统 12. 更新部署文档 13. 全面替换旧系统

您希望我: 14. 立即开始实施这个迁移方案? 15. 先处理更高优先级的硬编码安全问题? 16. 还是您有其他特定的要求?

迁移完成后,项目的安全性、可维护性和部署便利性将显著提升。