#!/usr/bin/env python3 """ 快速设置脚本 一键初始化知识图谱数据库并导入数据 """ import os import sys import subprocess import psycopg2 from config import DATABASE_CONFIG, JSON_DIRECTORY def run_command(command, description): """运行命令并处理结果""" print(f"\n🔧 {description}...") try: result = subprocess.run(command, shell=True, check=True, capture_output=True, text=True) print(f"✅ {description}完成") return True except subprocess.CalledProcessError as e: print(f"❌ {description}失败: {e}") print(f"错误输出: {e.stderr}") return False def check_dependencies(): """检查依赖""" print("🔍 检查系统依赖...") # 检查Python包 try: import psycopg2 print("✅ psycopg2 已安装") except ImportError: print("❌ psycopg2 未安装,正在安装...") if not run_command("pip install psycopg2-binary", "安装 psycopg2-binary"): return False return True def setup_database(): """设置数据库""" print("\n🗄️ 设置数据库...") # 连接到PostgreSQL(默认数据库) try: conn = psycopg2.connect( host=DATABASE_CONFIG['host'], port=DATABASE_CONFIG['port'], database='edu', # 连接到默认数据库 user=DATABASE_CONFIG['user'], password=DATABASE_CONFIG['password'] ) conn.autocommit = True cursor = conn.cursor() # 创建数据库 cursor.execute(f"SELECT 1 FROM pg_database WHERE datname = '{DATABASE_CONFIG['database']}'") if cursor.fetchone(): print(f"✅ 数据库 {DATABASE_CONFIG['database']} 已存在") else: cursor.execute(f"CREATE DATABASE {DATABASE_CONFIG['database']}") print(f"✅ 数据库 {DATABASE_CONFIG['database']} 创建成功") cursor.close() conn.close() # 执行架构脚本 schema_file = "database_schema.sql" if os.path.exists(schema_file): command = f'psql -h {DATABASE_CONFIG["host"]} -p {DATABASE_CONFIG["port"]} -U {DATABASE_CONFIG["user"]} -d {DATABASE_CONFIG["database"]} -f {schema_file}' if run_command(command, "执行数据库架构脚本"): print("✅ 数据库架构创建成功") else: return False else: print(f"❌ 找不到架构文件: {schema_file}") return False except Exception as e: print(f"❌ 数据库设置失败: {e}") return False return True def import_data(): """导入数据""" print("\n📊 开始导入数据...") # 检查JSON文件目录 if not os.path.exists(JSON_DIRECTORY): print(f"❌ JSON文件目录不存在: {JSON_DIRECTORY}") return False json_files = [f for f in os.listdir(JSON_DIRECTORY) if f.endswith('.json')] if not json_files: print(f"❌ 在 {JSON_DIRECTORY} 中没有找到JSON文件") return False print(f"📁 找到 {len(json_files)} 个JSON文件") # 运行导入脚本 command = "python data_import.py" if run_command(command, "数据导入"): print("✅ 数据导入成功") return True else: return False def validate_data(): """验证数据""" print("\n🔍 开始数据验证...") command = "python data_validation.py" if run_command(command, "数据验证"): print("✅ 数据验证完成") # 检查验证报告 if os.path.exists("validation_report.md"): print("📄 验证报告已生成: validation_report.md") return True else: print("⚠️ 数据验证发现问题,请查看详细报告") return False def show_statistics(): """显示统计信息""" print("\n📈 数据库统计信息:") try: conn = psycopg2.connect(**DATABASE_CONFIG) cursor = conn.cursor() # 基础统计 tables = [ ("knowledge_points", "知识点"), ("methods", "方法"), ("problems", "题目"), ("knowledge_relations", "知识点关系"), ] for table, name in tables: cursor.execute(f"SELECT COUNT(*) FROM {table}") count = cursor.fetchone()[0] print(f" • {name}: {count} 个") cursor.close() conn.close() except Exception as e: print(f"❌ 获取统计信息失败: {e}") def main(): """主函数""" print("🚀 高中数学知识图谱数据库设置向导") print("=" * 50) # 检查配置 if DATABASE_CONFIG['password'] == 'your_password': print("❌ 请先在 config.py 中配置数据库密码") return False # 步骤1: 检查依赖 if not check_dependencies(): return False # 步骤2: 设置数据库 if not setup_database(): return False # 步骤3: 导入数据 if not import_data(): return False # 步骤4: 验证数据 validate_data() # 验证失败不影响整体流程 # 步骤5: 显示统计信息 show_statistics() print("\n🎉 设置完成!") print("\n📋 下一步操作:") print("1. 查看 README.md 了解详细使用方法") print("2. 使用 query_examples.sql 中的查询示例") print("3. 使用 data_validation.py 进行数据验证") print("4. 使用 data_import.py 进行增量数据导入") return True if __name__ == "__main__": success = main() sys.exit(0 if success else 1)