Files
taiji-AI-PAD/services/mcp-server/reinit_database.py
T
2025-12-28 13:28:16 +00:00

121 lines
3.6 KiB
Python

#!/usr/bin/env python3
"""
重新初始化数据库表
用于在数据库表丢失时重新创建所有表结构
"""
import sys
import os
import asyncio
# 添加services/mcp-server到路径,以便导入模块
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'services', 'mcp-server'))
from sqlalchemy.ext.asyncio import create_async_engine
from models import Base
from config import settings
from database import prepare_database_url
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
async def reinit_database():
"""重新初始化数据库表"""
try:
# 准备数据库URL
database_url = prepare_database_url(settings.database_url)
# 确保使用asyncpg驱动
if database_url.startswith("postgresql://") and "+asyncpg" not in database_url:
database_url = database_url.replace("postgresql://", "postgresql+asyncpg://", 1)
logger.info(f"正在连接到数据库: {database_url.split('@')[1] if '@' in database_url else '本地数据库'}")
# 创建数据库引擎
engine = create_async_engine(database_url, echo=False)
logger.info("开始创建数据库表...")
# 创建所有表
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
logger.info("✓ 数据库表创建成功!")
# 列出所有创建的表
async with engine.begin() as conn:
# 获取所有表名
if "postgresql" in database_url:
result = await conn.execute(
"""
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public'
ORDER BY table_name
"""
)
else:
# SQLite
result = await conn.execute(
"""
SELECT name
FROM sqlite_master
WHERE type='table' AND name NOT LIKE 'sqlite_%'
ORDER BY name
"""
)
tables = result.fetchall()
table_names = [row[0] for row in tables]
logger.info(f"\n已创建的表列表(共 {len(table_names)} 个):")
for i, table_name in enumerate(table_names, 1):
logger.info(f" {i}. {table_name}")
await engine.dispose()
logger.info("\n数据库初始化完成!")
logger.info("注意:此脚本只创建表结构,不会创建初始数据。")
logger.info("如果需要创建初始数据,请运行服务或使用其他初始化脚本。")
return True
except Exception as e:
logger.error(f"✗ 数据库初始化失败: {e}")
import traceback
traceback.print_exc()
return False
async def main():
"""主函数"""
print("="*80)
print("重新初始化数据库表")
print("="*80)
print()
# 确认操作
print("警告:此操作将创建所有数据库表。")
print("如果表已存在,SQLAlchemy不会删除或修改现有表。")
print()
success = await reinit_database()
if success:
print("\n" + "="*80)
print("✓ 数据库表初始化成功!")
print("="*80)
sys.exit(0)
else:
print("\n" + "="*80)
print("✗ 数据库表初始化失败!")
print("="*80)
sys.exit(1)
if __name__ == "__main__":
asyncio.run(main())