数据库模型兼容性增强
This commit is contained in:
@@ -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]:
|
||||
'''
|
||||
|
||||
Reference in New Issue
Block a user