from collections.abc import Iterable import re import nonebot from nonebot.utils import is_coroutine_callable from tortoise import BaseDBAsyncClient, Tortoise from tortoise.connection import connections from tortoise.models import Model as Model_ from zhenxun.configs.config import BotConfig from zhenxun.utils.exception import HookPriorityException from zhenxun.utils.manager.priority_manager import PriorityLifecycle from .log import logger SCRIPT_METHOD = [] MODELS: list[str] = [] driver = nonebot.get_driver() def unicode_escape(value: str) -> str: """ 将字符串转换为Unicode转义形式(仅处理未转义的特殊字符) 已经转义过的字符串保持不变 """ if not value: return value if re.search(r"\\u[0-9a-fA-F]{4}", value): return value return "".join( char if 0x20 <= ord(char) <= 0x7E or char in ("\n", "\r", "\t") else f"\\u{ord(char):04x}" for char in value ) def unicode_unescape(value: str) -> str: """ 安全还原字符串中的Unicode转义序列 如果不是有效转义序列,保留原样 """ if not value: return value # 仅处理有效的 \uXXXX 格式 return re.sub( r"(?{len(SCRIPT_METHOD)} 个..." ) sql_list = [] for module, func in SCRIPT_METHOD: try: sql = await func() if is_coroutine_callable(func) else func() if sql: sql_list += sql except Exception as e: logger.debug(f"{module} 执行SCRIPT_METHOD方法出错...", e=e) for sql in sql_list: logger.debug(f"执行SQL: {sql}") try: await db.execute_query_dict(sql) # await TestSQL.raw(sql) except Exception as e: logger.debug(f"执行SQL: {sql} 错误...", e=e) if sql_list: logger.debug("SCRIPT_METHOD方法执行完毕!") await Tortoise.generate_schemas() logger.info("Database loaded successfully!") except Exception as e: raise DbConnectError(f"数据库连接错误... e:{e}") from e async def disconnect(): await connections.close_all()