zhenxun_bot/zhenxun/services/db_context.py

87 lines
2.3 KiB
Python
Raw Normal View History

2024-08-21 22:22:42 +08:00
from tortoise import Tortoise
2024-02-04 04:18:54 +08:00
from tortoise.connection import connections
from tortoise.models import Model as Model_
2024-09-02 21:45:37 +08:00
from nonebot.utils import is_coroutine_callable
2024-02-04 04:18:54 +08:00
2024-08-24 19:32:52 +08:00
from zhenxun.configs.config import BotConfig
2024-08-10 12:10:53 +08:00
from zhenxun.configs.path_config import DATA_PATH
2024-02-04 04:18:54 +08:00
from .log import logger
SCRIPT_METHOD = []
2024-08-21 22:22:42 +08:00
MODELS: list[str] = []
2024-08-10 12:10:53 +08:00
DATABASE_SETTING_FILE = DATA_PATH / "database.json"
2024-02-04 04:18:54 +08:00
class Model(Model_):
"""
自动添加模块
Args:
2024-08-24 19:32:52 +08:00
Model_: Model
2024-02-04 04:18:54 +08:00
"""
def __init_subclass__(cls, **kwargs):
MODELS.append(cls.__module__)
if func := getattr(cls, "_run_script", None):
SCRIPT_METHOD.append((cls.__module__, func))
2024-09-02 21:45:37 +08:00
class DbUrlIsNode(Exception):
"""
数据库链接地址为空
"""
pass
class DbConnectError(Exception):
"""
数据库连接错误
"""
pass
2024-02-04 04:18:54 +08:00
async def init():
2024-08-24 19:32:52 +08:00
if not BotConfig.db_url:
2024-09-02 21:45:37 +08:00
raise DbUrlIsNode("数据库配置为空,请在.env.dev中配置DB_URL...")
2024-05-26 15:22:55 +08:00
try:
await Tortoise.init(
2024-08-24 19:32:52 +08:00
db_url=BotConfig.db_url,
modules={"models": MODELS},
timezone="Asia/Shanghai",
2024-02-25 03:18:34 +08:00
)
2024-05-26 15:22:55 +08:00
if SCRIPT_METHOD:
db = Tortoise.get_connection("default")
logger.debug(
2024-09-02 21:45:37 +08:00
"即将运行SCRIPT_METHOD方法, 合计 "
f"<u><y>{len(SCRIPT_METHOD)}</y></u> 个..."
2024-05-26 15:22:55 +08:00
)
sql_list = []
for module, func in SCRIPT_METHOD:
try:
2024-09-02 21:45:37 +08:00
sql = await func() if is_coroutine_callable(func) else func()
2024-05-26 15:22:55 +08:00
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)
2024-07-20 00:45:26 +08:00
if sql_list:
logger.debug("SCRIPT_METHOD方法执行完毕!")
2024-05-26 15:22:55 +08:00
await Tortoise.generate_schemas()
2024-09-02 21:45:37 +08:00
logger.info("Database loaded successfully!")
2024-05-26 15:22:55 +08:00
except Exception as e:
2024-09-02 21:45:37 +08:00
raise DbConnectError(f"数据库连接错误... e:{e}") from e
2024-02-04 04:18:54 +08:00
async def disconnect():
await connections.close_all()