#!/usr/bin/env python3 """ 完整的数据库初始化脚本 包括创建表和插入测试数据 """ import asyncio import sys from pathlib import Path from sqlalchemy import text from app.database import engine, Base, AsyncSessionLocal from loguru import logger # 导入初始化数据函数 from init_test_data import init_test_data logger.remove() logger.add(sys.stderr, level="INFO", format="{time:HH:mm:ss} | {level: <8} | {message}") async def test_database_connection(): """测试数据库连接""" logger.info("正在测试数据库连接...") try: async with engine.connect() as conn: result = await conn.execute(text("SELECT version()")) version = result.fetchone() logger.info(f"✅ 数据库连接成功") logger.info(f"数据库版本: {version[0] if version else 'N/A'}") return True except Exception as e: logger.error(f"❌ 数据库连接失败: {e}") logger.error("\n请检查:") logger.error("1. PostgreSQL 服务是否运行") logger.error("2. 数据库 'deeprisk_db' 是否存在") logger.error("3. 用户名密码是否正确") logger.error(f"\n当前数据库URL配置:") logger.error(f"postgresql+asyncpg://postgres:***@localhost:15432/deeprisk_db") return False async def init_tables(): """初始化数据库表""" logger.info("=" * 60) logger.info("正在初始化数据库表结构...") logger.info("=" * 60) try: async with engine.begin() as conn: # 创建所有表 await conn.run_sync(Base.metadata.create_all) logger.info("✅ 数据库表创建成功") # 列出已创建的表 result = await conn.execute( text(""" SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_name """) ) tables = result.fetchall() if tables: logger.info("\n已创建的表:") for table in tables: logger.info(f" ✓ {table[0]}") except Exception as e: logger.error(f"❌ 创建数据库表失败: {e}") import traceback traceback.print_exc() raise async def show_data_summary(): """显示数据统计""" logger.info("\n" + "=" * 60) logger.info("数据库数据统计") logger.info("=" * 60) async with AsyncSessionLocal() as session: try: # 检查各表的数据量 tables = [ "mcn_agency", "streamer_info", "platform_recharge", "contract", "order", "settlement", "expense", "tax_declaration", "bank_transaction", "invoice", "detection_rule", ] for table in tables: try: result = await session.execute(text(f"SELECT COUNT(*) FROM {table}")) count = result.scalar() logger.info(f" {table:30} : {count:6} 条记录") except Exception as e: logger.warning(f" {table:30} : 查询失败 ({str(e)[:30]})") except Exception as e: logger.error(f"统计查询失败: {e}") async def main(): """主函数""" logger.info("\n" + "=" * 60) logger.info("🎯 DeepRisk 数据库完整初始化") logger.info("=" * 60 + "\n") # 1. 测试数据库连接 if not await test_database_connection(): sys.exit(1) # 2. 初始化表结构 await init_tables() # 3. 初始化测试数据 try: await init_test_data() except Exception as e: logger.error(f"初始化测试数据失败: {e}") logger.warning("表创建成功,但数据插入失败") logger.warning("可以稍后手动运行 init_test_data.py 插入数据") # 4. 显示数据统计 await show_data_summary() logger.info("\n" + "=" * 60) logger.info("🎉 数据库初始化完成!") logger.info("=" * 60) logger.info("\n可以使用以下方式启动应用:") logger.info(" uvicorn app.main:app --reload --host 0.0.0.0 --port 8000\n") await engine.dispose() if __name__ == "__main__": asyncio.run(main())