Files
aitsc/migrate_localStorage_to_database.py
2025-10-10 23:39:54 +08:00

258 lines
10 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
将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()