diff --git a/src/common/database/database_model.py b/src/common/database/database_model.py index 2e814aa69..0f5a8d022 100644 --- a/src/common/database/database_model.py +++ b/src/common/database/database_model.py @@ -366,12 +366,12 @@ def initialize_database(): # 检查字段 cursor = db.execute_sql(f"PRAGMA table_info('{table_name}')") existing_columns = {row[1] for row in cursor.fetchall()} - model_fields = model._meta.fields - - for field_name, field_obj in model_fields.items(): + model_fields = set(model._meta.fields.keys()) + + # 检查并添加缺失字段(原有逻辑) + for field_name, field_obj in model._meta.fields.items(): if field_name not in existing_columns: logger.info(f"表 '{table_name}' 缺失字段 '{field_name}',正在添加...") - # 获取字段类型 field_type = field_obj.__class__.__name__ sql_type = { 'TextField': 'TEXT', @@ -381,8 +381,6 @@ def initialize_database(): 'BooleanField': 'INTEGER', 'DateTimeField': 'DATETIME' }.get(field_type, 'TEXT') - - # 构建 ALTER TABLE 语句 alter_sql = f'ALTER TABLE {table_name} ADD COLUMN {field_name} {sql_type}' if field_obj.null: alter_sql += ' NULL' @@ -390,9 +388,18 @@ def initialize_database(): alter_sql += ' NOT NULL' if hasattr(field_obj, 'default') and field_obj.default is not None: alter_sql += f' DEFAULT {field_obj.default}' - db.execute_sql(alter_sql) logger.info(f"字段 '{field_name}' 添加成功") + + # 检查并删除多余字段(新增逻辑) + extra_fields = existing_columns - model_fields + for field_name in extra_fields: + try: + logger.warning(f"表 '{table_name}' 存在多余字段 '{field_name}',正在尝试删除...") + db.execute_sql(f"ALTER TABLE {table_name} DROP COLUMN {field_name}") + logger.info(f"字段 '{field_name}' 删除成功") + except Exception as e: + logger.error(f"删除字段 '{field_name}' 失败: {e}") except Exception as e: logger.exception(f"检查表或字段是否存在时出错: {e}") # 如果检查失败(例如数据库不可用),则退出