数据库模型兼容性增强
This commit is contained in:
@@ -36,7 +36,8 @@ class PluginInterface(ABC):
|
|||||||
|
|
||||||
@final
|
@final
|
||||||
def register_table(self, db_model: DatabaseModel) -> None:
|
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()])})"
|
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}")
|
config.Log("Info", f"{ConsoleFrontColor.LIGHTMAGENTA_EX}为表 {db_model.table_name} 创建: {sql}{ConsoleFrontColor.RESET}")
|
||||||
try:
|
try:
|
||||||
@@ -44,6 +45,40 @@ class PluginInterface(ABC):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
config.Log("Error", f"{ConsoleFrontColor.RED}为表 {db_model.table_name} 创建失败: {e}{ConsoleFrontColor.RESET}")
|
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
|
@final
|
||||||
def execute(self, path:str) -> Optional[APIRouter]:
|
def execute(self, path:str) -> Optional[APIRouter]:
|
||||||
'''
|
'''
|
||||||
|
|||||||
Reference in New Issue
Block a user