diff --git a/CoreModules/plugin_interface.py b/CoreModules/plugin_interface.py index 95db270..e5e9808 100644 --- a/CoreModules/plugin_interface.py +++ b/CoreModules/plugin_interface.py @@ -36,7 +36,8 @@ class PluginInterface(ABC): @final def register_table(self, db_model: DatabaseModel) -> None: - cursor = get_db().conn.cursor() + db = get_db() + cursor = db.conn.cursor() sql = f"CREATE TABLE IF NOT EXISTS {db_model.table_name} ({', '.join([f'{name} {field_def}' for name, field_def in db_model.column_defs.items()])})" config.Log("Info", f"{ConsoleFrontColor.LIGHTMAGENTA_EX}为表 {db_model.table_name} 创建: {sql}{ConsoleFrontColor.RESET}") try: @@ -44,6 +45,40 @@ class PluginInterface(ABC): except Exception as e: config.Log("Error", f"{ConsoleFrontColor.RED}为表 {db_model.table_name} 创建失败: {e}{ConsoleFrontColor.RESET}") + try: + cursor.execute(f"PRAGMA table_info({db_model.table_name})") + existing_columns = {row["name"] for row in cursor.fetchall()} + except Exception as e: + config.Log("Error", f"{ConsoleFrontColor.RED}查询表 {db_model.table_name} 列信息失败: {e}{ConsoleFrontColor.RESET}") + return + + constraint_keywords = ("PRIMARY KEY", "FOREIGN KEY", "UNIQUE", "CHECK") + for column_name, column_def in db_model.column_defs.items(): + column_name_upper = column_name.upper() + column_def_upper = column_def.upper() + if any(keyword in column_name_upper for keyword in constraint_keywords) or any( + column_def_upper.startswith(keyword) for keyword in constraint_keywords + ): + continue + if " " in column_name or "(" in column_name: + continue + if column_name in existing_columns: + continue + alter_sql = f"ALTER TABLE {db_model.table_name} ADD COLUMN {column_name} {column_def}" + config.Log( + "Info", + f"{ConsoleFrontColor.LIGHTMAGENTA_EX}为表 {db_model.table_name} 添加缺失列: {alter_sql}{ConsoleFrontColor.RESET}", + ) + try: + cursor.execute(alter_sql) + except Exception as e: + config.Log("Error", f"{ConsoleFrontColor.RED}为表 {db_model.table_name} 添加列 {column_name} 失败: {e}{ConsoleFrontColor.RESET}") + continue + try: + db.conn.commit() + except Exception as e: + config.Log("Error", f"{ConsoleFrontColor.RED}提交表 {db_model.table_name} 列更新失败: {e}{ConsoleFrontColor.RESET}") + @final def execute(self, path:str) -> Optional[APIRouter]: '''