Files
tsp-assistant/init_database.py
2025-09-06 21:06:18 +08:00

426 lines
18 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.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
TSP助手数据库初始化脚本 - 包含所有数据库操作
"""
import sys
import os
import logging
from sqlalchemy import text
from datetime import datetime
# 添加项目根目录到Python路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from src.config.config import Config
from src.utils.helpers import setup_logging
from src.core.database import db_manager
from src.core.models import Base, WorkOrder, KnowledgeEntry, Conversation, Analytics, Alert, VehicleData
def init_database():
"""初始化数据库 - 包含所有数据库操作"""
print("=" * 60)
print("🚀 TSP智能助手数据库初始化")
print("=" * 60)
try:
# 设置日志
setup_logging(Config.LOG_LEVEL, Config.LOG_FILE)
logger = logging.getLogger(__name__)
# 测试数据库连接
if not db_manager.test_connection():
print("❌ 数据库连接失败")
return False
print("✅ 数据库连接成功")
# 创建所有表
print("\n📋 创建数据库表...")
Base.metadata.create_all(bind=db_manager.engine)
print("✅ 数据库表创建成功")
# 执行数据库迁移(添加新字段和表)
print("\n🔄 执行数据库迁移...")
migrate_database()
# 插入初始数据
print("\n📊 插入初始数据...")
insert_initial_data()
# 添加示例车辆数据
print("\n🚗 添加示例车辆数据...")
add_sample_vehicle_data()
# 验证知识库条目
print("\n🔍 验证知识库条目...")
verify_existing_knowledge()
print("\n✅ 数据库初始化完成")
return True
except Exception as e:
print(f"❌ 数据库初始化失败: {e}")
return False
def migrate_database():
"""执行数据库迁移 - 添加新字段和表"""
try:
with db_manager.get_session() as session:
# 检查数据库类型
db_url = db_manager.engine.url
is_mysql = 'mysql' in str(db_url)
is_sqlite = 'sqlite' in str(db_url)
print(" 📝 检查知识库验证字段...")
# 检查is_verified字段是否存在
if is_mysql:
result = session.execute(text("""
SELECT COUNT(*) as count
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'knowledge_entries'
AND COLUMN_NAME = 'is_verified'
""")).fetchone()
else: # SQLite
result = session.execute(text("""
SELECT COUNT(*) as count
FROM pragma_table_info('knowledge_entries')
WHERE name = 'is_verified'
""")).fetchone()
if result.count == 0:
print(" 添加is_verified字段...")
if is_mysql:
session.execute(text("ALTER TABLE knowledge_entries ADD COLUMN is_verified BOOLEAN DEFAULT FALSE"))
else:
session.execute(text("ALTER TABLE knowledge_entries ADD COLUMN is_verified BOOLEAN DEFAULT FALSE"))
print(" ✅ is_verified字段添加成功")
else:
print(" ✅ is_verified字段已存在")
# 检查verified_by字段是否存在
if is_mysql:
result = session.execute(text("""
SELECT COUNT(*) as count
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'knowledge_entries'
AND COLUMN_NAME = 'verified_by'
""")).fetchone()
else: # SQLite
result = session.execute(text("""
SELECT COUNT(*) as count
FROM pragma_table_info('knowledge_entries')
WHERE name = 'verified_by'
""")).fetchone()
if result.count == 0:
print(" 添加verified_by字段...")
if is_mysql:
session.execute(text("ALTER TABLE knowledge_entries ADD COLUMN verified_by VARCHAR(100)"))
else:
session.execute(text("ALTER TABLE knowledge_entries ADD COLUMN verified_by VARCHAR(100)"))
print(" ✅ verified_by字段添加成功")
else:
print(" ✅ verified_by字段已存在")
# 检查verified_at字段是否存在
if is_mysql:
result = session.execute(text("""
SELECT COUNT(*) as count
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'knowledge_entries'
AND COLUMN_NAME = 'verified_at'
""")).fetchone()
else: # SQLite
result = session.execute(text("""
SELECT COUNT(*) as count
FROM pragma_table_info('knowledge_entries')
WHERE name = 'verified_at'
""")).fetchone()
if result.count == 0:
print(" 添加verified_at字段...")
if is_mysql:
session.execute(text("ALTER TABLE knowledge_entries ADD COLUMN verified_at DATETIME"))
else:
session.execute(text("ALTER TABLE knowledge_entries ADD COLUMN verified_at DATETIME"))
print(" ✅ verified_at字段添加成功")
else:
print(" ✅ verified_at字段已存在")
# 检查车辆数据表是否存在
if is_mysql:
result = session.execute(text("""
SELECT COUNT(*) as count
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'vehicle_data'
""")).fetchone()
else: # SQLite
result = session.execute(text("""
SELECT name FROM sqlite_master
WHERE type='table' AND name='vehicle_data'
""")).fetchone()
if (is_mysql and result.count == 0) or (not is_mysql and not result):
print(" 创建vehicle_data表...")
VehicleData.__table__.create(session.bind, checkfirst=True)
print(" ✅ vehicle_data表创建成功")
else:
print(" ✅ vehicle_data表已存在")
session.commit()
print(" ✅ 数据库迁移完成")
except Exception as e:
print(f" ❌ 数据库迁移失败: {e}")
return False
return True
def insert_initial_data():
"""插入初始数据"""
try:
with db_manager.get_session() as session:
# 检查是否已有数据
existing_entries = session.query(KnowledgeEntry).count()
if existing_entries > 0:
print(" ✅ 数据库中已有数据,跳过初始数据插入")
return
# 插入示例知识库条目
initial_knowledge = [
{
"question": "如何重置密码?",
"answer": "您可以通过以下步骤重置密码1. 点击登录页面的'忘记密码'链接 2. 输入您的邮箱地址 3. 检查邮箱并点击重置链接 4. 设置新密码",
"category": "账户问题",
"confidence_score": 0.9,
"is_verified": True,
"verified_by": "system",
"verified_at": datetime.now()
},
{
"question": "账户被锁定了怎么办?",
"answer": "如果您的账户被锁定请尝试以下解决方案1. 等待15分钟后重试登录 2. 如果问题持续请联系客服并提供您的用户ID",
"category": "账户问题",
"confidence_score": 0.8,
"is_verified": True,
"verified_by": "system",
"verified_at": datetime.now()
},
{
"question": "如何修改个人信息?",
"answer": "您可以在个人设置页面修改个人信息1. 登录后点击右上角的个人头像 2. 选择'个人设置' 3. 修改相关信息并保存",
"category": "账户问题",
"confidence_score": 0.7,
"is_verified": True,
"verified_by": "system",
"verified_at": datetime.now()
},
{
"question": "支付失败怎么办?",
"answer": "如果支付失败请检查1. 银行卡余额是否充足 2. 银行卡是否支持在线支付 3. 网络连接是否正常 4. 如果问题持续,请联系支付客服",
"category": "支付问题",
"confidence_score": 0.8,
"is_verified": True,
"verified_by": "system",
"verified_at": datetime.now()
},
{
"question": "如何申请退款?",
"answer": "申请退款流程1. 在订单详情页面点击'申请退款' 2. 选择退款原因 3. 填写退款说明 4. 提交申请后等待审核",
"category": "支付问题",
"confidence_score": 0.7,
"is_verified": True,
"verified_by": "system",
"verified_at": datetime.now()
},
{
"question": "系统无法访问怎么办?",
"answer": "如果系统无法访问请尝试1. 检查网络连接 2. 清除浏览器缓存 3. 尝试使用其他浏览器 4. 如果问题持续,请联系技术支持",
"category": "技术问题",
"confidence_score": 0.8,
"is_verified": True,
"verified_by": "system",
"verified_at": datetime.now()
},
{
"question": "如何联系客服?",
"answer": "您可以通过以下方式联系客服1. 在线客服:点击页面右下角的客服图标 2. 电话客服400-123-4567 3. 邮箱客服support@example.com",
"category": "服务问题",
"confidence_score": 0.9,
"is_verified": True,
"verified_by": "system",
"verified_at": datetime.now()
},
{
"question": "如何远程启动车辆?",
"answer": "远程启动车辆需要满足以下条件1. 车辆处于P档 2. 手刹拉起 3. 车门已锁 4. 电池电量充足。操作步骤打开APP → 点击远程启动按钮 → 确认启动条件 → 等待启动完成",
"category": "远程控制",
"confidence_score": 0.9,
"is_verified": True,
"verified_by": "system",
"verified_at": datetime.now()
},
{
"question": "APP显示车辆信息错误怎么办",
"answer": "如果APP显示车辆信息错误请尝试1. 重新登录APP 2. 重启车辆系统 3. 检查网络连接 4. 如果问题持续,请联系客服",
"category": "APP功能",
"confidence_score": 0.8,
"is_verified": True,
"verified_by": "system",
"verified_at": datetime.now()
},
{
"question": "车辆无法远程启动的原因?",
"answer": "车辆无法远程启动的常见原因1. 车辆不在P档 2. 手刹未拉起 3. 车门未锁 4. 电池电量不足 5. 网络信号差 6. 车辆系统故障",
"category": "远程控制",
"confidence_score": 0.9,
"is_verified": True,
"verified_by": "system",
"verified_at": datetime.now()
}
]
for knowledge in initial_knowledge:
entry = KnowledgeEntry(**knowledge)
session.add(entry)
session.commit()
print(f" ✅ 成功插入 {len(initial_knowledge)} 条知识库条目")
except Exception as e:
print(f" ❌ 插入初始数据失败: {e}")
def add_sample_vehicle_data():
"""添加示例车辆数据"""
try:
from src.vehicle.vehicle_data_manager import VehicleDataManager
vehicle_manager = VehicleDataManager()
success = vehicle_manager.add_sample_vehicle_data()
if success:
print(" ✅ 示例车辆数据添加成功")
else:
print(" ❌ 示例车辆数据添加失败")
except Exception as e:
print(f" ❌ 添加示例车辆数据失败: {e}")
def verify_existing_knowledge():
"""验证现有的知识库条目"""
try:
with db_manager.get_session() as session:
# 获取所有未验证的知识库条目
unverified_entries = session.query(KnowledgeEntry).filter(
KnowledgeEntry.is_verified == False
).all()
if unverified_entries:
print(f" 📝 发现 {len(unverified_entries)} 条未验证的知识库条目")
# 将现有的知识库条目标记为已验证
for entry in unverified_entries:
entry.is_verified = True
entry.verified_by = "system_init"
entry.verified_at = datetime.now()
session.commit()
print(f" ✅ 成功验证 {len(unverified_entries)} 条知识库条目")
else:
print(" ✅ 所有知识库条目已验证")
except Exception as e:
print(f" ❌ 验证知识库条目失败: {e}")
def check_database_status():
"""检查数据库状态"""
print("\n" + "=" * 60)
print("📊 数据库状态检查")
print("=" * 60)
try:
with db_manager.get_session() as session:
# 检查各表的记录数
work_orders_count = session.query(WorkOrder).count()
conversations_count = session.query(Conversation).count()
knowledge_entries_count = session.query(KnowledgeEntry).count()
verified_knowledge_count = session.query(KnowledgeEntry).filter(KnowledgeEntry.is_verified == True).count()
unverified_knowledge_count = session.query(KnowledgeEntry).filter(KnowledgeEntry.is_verified == False).count()
analytics_count = session.query(Analytics).count()
alerts_count = session.query(Alert).count()
vehicle_data_count = session.query(VehicleData).count()
print(f"📋 工单表记录数: {work_orders_count}")
print(f"💬 对话表记录数: {conversations_count}")
print(f"📚 知识库表记录数: {knowledge_entries_count}")
print(f" - 已验证: {verified_knowledge_count}")
print(f" - 未验证: {unverified_knowledge_count}")
print(f"📊 分析表记录数: {analytics_count}")
print(f"🚨 预警表记录数: {alerts_count}")
print(f"🚗 车辆数据表记录数: {vehicle_data_count}")
# 检查车辆数据详情
if vehicle_data_count > 0:
vehicle_ids = session.query(VehicleData.vehicle_id).distinct().all()
print(f" - 车辆数量: {len(vehicle_ids)}")
for vehicle_id in vehicle_ids[:3]: # 显示前3个车辆
vehicle_data_types = session.query(VehicleData.data_type).filter(
VehicleData.vehicle_id == vehicle_id[0]
).distinct().all()
print(f" - 车辆 {vehicle_id[0]}: {len(vehicle_data_types)} 种数据类型")
print("\n✅ 数据库状态检查完成")
except Exception as e:
print(f"❌ 数据库状态检查失败: {e}")
def main():
"""主函数"""
print("🚀 TSP智能助手数据库初始化工具")
print("=" * 60)
# 初始化数据库
if init_database():
# 检查数据库状态
check_database_status()
print("\n" + "=" * 60)
print("🎉 数据库初始化成功!")
print("=" * 60)
print("✅ 已完成的操作:")
print(" - 创建所有数据库表")
print(" - 添加知识库验证字段")
print(" - 创建车辆数据表")
print(" - 插入初始知识库数据")
print(" - 添加示例车辆数据")
print(" - 验证所有知识库条目")
print("\n🚀 现在您可以运行以下命令启动系统:")
print(" python start_dashboard.py")
print("\n🧪 或运行功能测试:")
print(" python test_new_features.py")
print("\n📋 新功能包括:")
print(" - 知识库分页显示")
print(" - 知识库验证机制")
print(" - 车辆实时数据管理")
print(" - 文件上传生成知识库")
print(" - 智能对话结合车辆数据")
else:
print("\n" + "=" * 60)
print("❌ 数据库初始化失败!")
print("=" * 60)
print("请检查:")
print("1. 数据库文件权限")
print("2. SQLite是否已安装")
print("3. 磁盘空间是否充足")
print("4. Python依赖库是否完整")
if __name__ == "__main__":
main()