227 lines
8.6 KiB
Markdown
227 lines
8.6 KiB
Markdown
|
|
● 根据分析,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
|
|||
|
|
|
|||
|
|
2. 备份现有数据库中的模板数据
|
|||
|
|
# 创建备份脚本
|
|||
|
|
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()
|
|||
|
|
|
|||
|
|
2. 更新 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
|
|||
|
|
|
|||
|
|
2. 确保 .env 不被提交
|
|||
|
|
# 检查 .gitignore
|
|||
|
|
echo ".env" >> /d/aaa/aitsc/.gitignore
|
|||
|
|
echo ".env.*" >> /d/aaa/aitsc/.gitignore
|
|||
|
|
echo "!*.example" >> /d/aaa/aitsc/.gitignore
|
|||
|
|
|
|||
|
|
3. 创建部署说明文档
|
|||
|
|
# 模板数据初始化说明
|
|||
|
|
|
|||
|
|
## 新系统使用
|
|||
|
|
4. 复制环境变量模板:`cp .env.example .env`
|
|||
|
|
5. 编辑 .env 文件,填入真实凭据
|
|||
|
|
6. 初始化模板数据:`python scripts/init_prompt_templates.py`
|
|||
|
|
|
|||
|
|
## 旧系统兼容
|
|||
|
|
旧命令 `python src/flask_prompt_master/promptsTemplates.py [local|tencent]`
|
|||
|
|
将自动重定向到新系统。
|
|||
|
|
|
|||
|
|
阶段四:测试和验证(30分钟)
|
|||
|
|
|
|||
|
|
7. 测试脚本
|
|||
|
|
# 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. 还是您有其他特定的要求?
|
|||
|
|
|
|||
|
|
迁移完成后,项目的安全性、可维护性和部署便利性将显著提升。
|