Files
aitsc/migrate_localStorage_to_database.py

258 lines
10 KiB
Python
Raw Normal View History

2025-10-10 23:39:54 +08:00
"""
将localStorage中的优化历史数据迁移到腾讯云数据库
"""
import json
import os
import sys
from datetime import datetime
# 添加项目路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from src.flask_prompt_master.models.optimization_history import (
OptimizationHistory, OptimizationTag, UserUsageStats
)
def create_app():
"""创建Flask应用"""
app = Flask(__name__)
# 配置数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@host:port/database'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 初始化扩展
db = SQLAlchemy(app)
login_manager = LoginManager()
login_manager.init_app(app)
return app, db
def migrate_localStorage_data():
"""迁移localStorage数据到数据库"""
app, db = create_app()
with app.app_context():
print("开始迁移localStorage数据到数据库...")
# 模拟localStorage数据实际使用时需要从浏览器获取
sample_localStorage_data = [
{
"id": 1704672000000,
"timestamp": "2024-01-08T12:00:00.000Z",
"original": "请帮我写一个营销文案",
"optimized": "以下是针对您需求的专业营销文案:\n\n【产品定位】\n明确产品核心价值主张...",
"type": "提示词优化"
},
{
"id": 1704675600000,
"timestamp": "2024-01-08T13:00:00.000Z",
"original": "如何做金融投资",
"optimized": "【专业金融投资提示框架】\n一、投资主体定位\n1. 请说明您的风险承受能力等级...",
"type": "提示词优化"
}
]
migrated_count = 0
error_count = 0
for data in sample_localStorage_data:
try:
# 解析时间戳
timestamp = datetime.fromisoformat(data['timestamp'].replace('Z', '+00:00'))
# 创建历史记录假设用户ID为1实际使用时需要根据登录用户确定
history = OptimizationHistory(
user_id=1, # 实际使用时需要从登录用户获取
original_text=data['original'],
optimized_text=data['optimized'],
optimization_type=data.get('type', '提示词优化'),
created_at=timestamp
)
db.session.add(history)
db.session.flush() # 获取ID
# 添加默认标签
default_tags = ['逻辑强化', '场景适配', '结构优化']
for tag_name in default_tags:
tag = OptimizationTag(
history_id=history.id,
tag_name=tag_name,
tag_type='optimization'
)
db.session.add(tag)
migrated_count += 1
print(f"✓ 迁移记录 {migrated_count}: {data['original'][:30]}...")
except Exception as e:
error_count += 1
print(f"✗ 迁移失败: {str(e)}")
# 提交所有更改
try:
db.session.commit()
print(f"\n迁移完成!")
print(f"成功迁移: {migrated_count} 条记录")
print(f"失败记录: {error_count}")
except Exception as e:
db.session.rollback()
print(f"提交失败: {str(e)}")
def create_sample_data():
"""创建示例数据"""
app, db = create_app()
with app.app_context():
print("创建示例数据...")
# 创建示例历史记录
sample_histories = [
{
'user_id': 1,
'original_text': '请帮我写一个产品介绍',
'optimized_text': '以下是专业的产品介绍模板:\n\n【产品概述】\n产品名称:[产品名称]\n核心功能:[主要功能]\n目标用户:[用户群体]\n\n【产品特色】\n1. 独特卖点1\n2. 独特卖点2\n3. 独特卖点3\n\n【使用场景】\n场景1具体应用情况\n场景2具体应用情况\n\n【技术优势】\n- 技术特点1\n- 技术特点2\n- 技术特点3',
'optimization_type': '产品文案',
'industry': '科技',
'profession': '产品经理',
'satisfaction_rating': 5
},
{
'user_id': 1,
'original_text': '如何写邮件',
'optimized_text': '【专业商务邮件写作指南】\n\n一、邮件结构\n1. 主题行:简洁明确,突出要点\n2. 称呼:根据关系选择正式或非正式\n3. 正文:逻辑清晰,分段明确\n4. 结尾:礼貌用语+签名\n\n二、写作要点\n- 语言简洁:避免冗长句子\n- 重点突出:使用加粗或列表\n- 语气恰当:根据收件人调整\n- 检查无误:发送前仔细校对\n\n三、常见类型\n1. 工作汇报邮件\n2. 会议邀请邮件\n3. 项目协调邮件\n4. 客户沟通邮件',
'optimization_type': '商务邮件',
'industry': '商务',
'profession': '行政助理',
'satisfaction_rating': 4
},
{
'user_id': 1,
'original_text': '数据库设计',
'optimized_text': '【数据库设计最佳实践】\n\n一、需求分析\n1. 业务需求梳理\n2. 数据关系分析\n3. 性能要求评估\n\n二、表结构设计\n- 主键设计自增ID或UUID\n- 字段类型:选择合适的数据类型\n- 索引设计:提高查询性能\n- 约束设置:保证数据完整性\n\n三、优化策略\n1. 分库分表:应对大数据量\n2. 读写分离:提高并发性能\n3. 缓存策略:减少数据库压力\n4. 监控告警:及时发现问题',
'optimization_type': '技术文档',
'industry': 'IT',
'profession': '后端开发',
'satisfaction_rating': 5
}
]
for i, history_data in enumerate(sample_histories):
try:
# 创建历史记录
history = OptimizationHistory(**history_data)
db.session.add(history)
db.session.flush()
# 添加标签
tags = ['逻辑强化', '场景适配', '结构优化']
for tag_name in tags:
tag = OptimizationTag(
history_id=history.id,
tag_name=tag_name,
tag_type='optimization'
)
db.session.add(tag)
print(f"✓ 创建示例记录 {i+1}: {history_data['original_text'][:30]}...")
except Exception as e:
print(f"✗ 创建失败: {str(e)}")
# 创建用户统计
try:
from datetime import date
stats = UserUsageStats(
user_id=1,
date=date.today(),
generation_count=3,
total_time_saved=15,
avg_rating=4.7,
total_ratings=3
)
db.session.add(stats)
print("✓ 创建用户统计")
except Exception as e:
print(f"✗ 创建统计失败: {str(e)}")
# 提交所有更改
try:
db.session.commit()
print("\n示例数据创建完成!")
except Exception as e:
db.session.rollback()
print(f"提交失败: {str(e)}")
def backup_localStorage_data():
"""备份localStorage数据"""
print("备份localStorage数据...")
# 这里应该从浏览器获取localStorage数据
# 实际实现需要JavaScript代码从浏览器获取数据
backup_script = """
// 在浏览器控制台运行此代码来备份localStorage数据
function backupOptimizationHistory() {
const history = JSON.parse(localStorage.getItem('optimization_history') || '[]');
const stats = JSON.parse(localStorage.getItem('usage_stats') || '{}');
const backup = {
timestamp: new Date().toISOString(),
history: history,
stats: stats,
count: history.length
};
// 下载备份文件
const blob = new Blob([JSON.stringify(backup, null, 2)], {type: 'application/json'});
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `optimization_history_backup_${new Date().toISOString().split('T')[0]}.json`;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
console.log(`备份完成 ${history.length} 条记录`);
return backup;
}
// 运行备份
backupOptimizationHistory();
"""
print("请在浏览器控制台运行以下代码来备份数据:")
print(backup_script)
def main():
"""主函数"""
print("=== 优化历史数据迁移工具 ===")
print("1. 备份localStorage数据")
print("2. 创建示例数据")
print("3. 迁移localStorage数据")
print("4. 退出")
while True:
choice = input("\n请选择操作 (1-4): ").strip()
if choice == '1':
backup_localStorage_data()
elif choice == '2':
create_sample_data()
elif choice == '3':
migrate_localStorage_data()
elif choice == '4':
print("退出程序")
break
else:
print("无效选择,请重新输入")
if __name__ == '__main__':
main()