From 27c63380c29c2696b556b7acc0216ac122d66d95 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Sun, 17 Aug 2025 15:59:56 +0800 Subject: [PATCH] =?UTF-8?q?refactor(core):=20=E8=B0=83=E6=95=B4=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E5=88=9D=E5=A7=8B=E5=8C=96=E6=97=B6=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将数据库的初始化、表结构创建和自动迁移逻辑从配置文件加载时移动到主程序 `raw_main` 函数中。 这一改动旨在解决循环导入问题,并确保数据库在所有配置和核心模块加载完毕后才进行初始化,提高了程序的启动鲁棒性和模块独立性。 --- bot.py | 29 ++++++++++++++++++++++++ src/common/database/sqlalchemy_models.py | 4 +++- src/config/config.py | 20 ---------------- 3 files changed, 32 insertions(+), 21 deletions(-) diff --git a/bot.py b/bot.py index 5342be7ce..65e420c7f 100644 --- a/bot.py +++ b/bot.py @@ -200,6 +200,35 @@ def raw_main(): logger.info("检查EULA和隐私条款完成") easter_egg() + + # 在此处初始化数据库 + from src.config.config import global_config + from src.common.database.database import initialize_sql_database + from src.common.database.sqlalchemy_models import initialize_database as init_db + from src.common.database.db_migration import check_and_migrate_database + + logger.info("正在初始化数据库连接...") + try: + initialize_sql_database(global_config.database) + logger.info(f"数据库连接初始化成功,使用 {global_config.database.database_type} 数据库") + except Exception as e: + logger.error(f"数据库连接初始化失败: {e}") + raise e + + logger.info("正在初始化数据库表结构...") + try: + init_db() + logger.info("数据库表结构初始化完成") + except Exception as e: + logger.error(f"数据库表结构初始化失败: {e}") + raise e + + # 执行数据库自动迁移检查 + try: + check_and_migrate_database() + except Exception as e: + logger.error(f"数据库自动迁移失败: {e}") + raise e # 返回MainSystem实例 return MainSystem() diff --git a/src/common/database/sqlalchemy_models.py b/src/common/database/sqlalchemy_models.py index 85ad6c281..91b6fa837 100644 --- a/src/common/database/sqlalchemy_models.py +++ b/src/common/database/sqlalchemy_models.py @@ -9,7 +9,6 @@ from sqlalchemy.orm import sessionmaker from sqlalchemy.pool import QueuePool import os import datetime -from src.config.config import global_config from src.common.logger import get_logger import threading from contextlib import contextmanager @@ -25,6 +24,7 @@ def get_string_field(max_length=255, **kwargs): 根据数据库类型返回合适的字符串字段 MySQL需要指定长度的VARCHAR用于索引,SQLite可以使用Text """ + from src.config.config import global_config if global_config.database.database_type == "mysql": return String(max_length, **kwargs) else: @@ -436,6 +436,7 @@ _SessionLocal = None def get_database_url(): """获取数据库连接URL""" + from src.config.config import global_config config = global_config.database if config.database_type == "mysql": @@ -482,6 +483,7 @@ def initialize_database(): return _engine, _SessionLocal database_url = get_database_url() + from src.config.config import global_config config = global_config.database # 配置引擎参数 diff --git a/src/config/config.py b/src/config/config.py index 98d71a665..e3a6b3f07 100644 --- a/src/config/config.py +++ b/src/config/config.py @@ -481,24 +481,4 @@ logger.info("正在品鉴配置文件...") global_config = load_config(config_path=os.path.join(CONFIG_DIR, "bot_config.toml")) model_config = api_ada_load_config(config_path=os.path.join(CONFIG_DIR, "model_config.toml")) -# 初始化数据库连接 -logger.info("正在初始化数据库连接...") -from src.common.database.database import initialize_sql_database -try: - initialize_sql_database(global_config.database) - logger.info(f"数据库连接初始化成功,使用 {global_config.database.database_type} 数据库") -except Exception as e: - logger.error(f"数据库连接初始化失败: {e}") - raise e - -# 初始化数据库表结构 -logger.info("正在初始化数据库表结构...") -from src.common.database.sqlalchemy_models import initialize_database as init_db -try: - init_db() - logger.info("数据库表结构初始化完成") -except Exception as e: - logger.error(f"数据库表结构初始化失败: {e}") - raise e - logger.info("非常的新鲜,非常的美味!")