From 0448cde7657b8bfda4d33bfd798111c50137da2b Mon Sep 17 00:00:00 2001 From: orion Date: Fri, 3 Apr 2026 19:00:45 +0000 Subject: [PATCH] fix: make code index migration mysql-compatible --- app/main.py | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/app/main.py b/app/main.py index 45ef1a9..09a45de 100644 --- a/app/main.py +++ b/app/main.py @@ -96,6 +96,25 @@ def _migrate_schema(): {"column_name": column_name}, ).fetchone() is not None + def _has_index(db, table_name: str, index_name: str) -> bool: + return db.execute( + text( + """ + SELECT 1 + FROM information_schema.STATISTICS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = :table_name + AND INDEX_NAME = :index_name + LIMIT 1 + """ + ), + {"table_name": table_name, "index_name": index_name}, + ).fetchone() is not None + + def _ensure_unique_index(db, table_name: str, index_name: str, columns_sql: str): + if not _has_index(db, table_name, index_name): + db.execute(text(f"CREATE UNIQUE INDEX {index_name} ON {table_name} ({columns_sql})")) + def _drop_fk_constraints(db, table_name: str, referenced_table: str): rows = db.execute(text( """ @@ -139,9 +158,7 @@ def _migrate_schema(): result = db.execute(text("SHOW COLUMNS FROM projects LIKE 'project_code'")) if not result.fetchone(): db.execute(text("ALTER TABLE projects ADD COLUMN project_code VARCHAR(16) NULL")) - db.execute(text("CREATE UNIQUE INDEX idx_projects_project_code ON projects (project_code)")) - else: - db.execute(text("CREATE UNIQUE INDEX IF NOT EXISTS idx_projects_project_code ON projects (project_code)")) + _ensure_unique_index(db, "projects", "idx_projects_project_code", "project_code") # projects.owner_name result = db.execute(text("SHOW COLUMNS FROM projects LIKE 'owner_name'")) @@ -176,7 +193,7 @@ def _migrate_schema(): db.execute(text("ALTER TABLE tasks ADD COLUMN created_by_id INTEGER NULL")) _ensure_fk(db, "tasks", "created_by_id", "users", "id", "fk_tasks_created_by_id") if _has_column(db, "tasks", "task_code"): - db.execute(text("CREATE UNIQUE INDEX IF NOT EXISTS idx_tasks_task_code ON tasks (task_code)")) + _ensure_unique_index(db, "tasks", "idx_tasks_task_code", "task_code") # milestones creator field result = db.execute(text("SHOW COLUMNS FROM milestones LIKE 'created_by_id'")) @@ -207,7 +224,7 @@ def _migrate_schema(): # --- Milestone status enum migration (old -> new) --- if _has_table(db, "milestones"): if _has_column(db, "milestones", "milestone_code"): - db.execute(text("CREATE UNIQUE INDEX IF NOT EXISTS idx_milestones_milestone_code ON milestones (milestone_code)")) + _ensure_unique_index(db, "milestones", "idx_milestones_milestone_code", "milestone_code") # Alter enum column to accept new values db.execute(text( "ALTER TABLE milestones MODIFY COLUMN status " @@ -264,16 +281,16 @@ def _migrate_schema(): db.execute(text("ALTER TABLE server_states ADD COLUMN plugin_version VARCHAR(64) NULL")) if _has_table(db, "meetings") and _has_column(db, "meetings", "meeting_code"): - db.execute(text("CREATE UNIQUE INDEX IF NOT EXISTS idx_meetings_meeting_code ON meetings (meeting_code)")) + _ensure_unique_index(db, "meetings", "idx_meetings_meeting_code", "meeting_code") if _has_table(db, "supports") and _has_column(db, "supports", "support_code"): - db.execute(text("CREATE UNIQUE INDEX IF NOT EXISTS idx_supports_support_code ON supports (support_code)")) + _ensure_unique_index(db, "supports", "idx_supports_support_code", "support_code") if _has_table(db, "proposes") and _has_column(db, "proposes", "propose_code"): - db.execute(text("CREATE UNIQUE INDEX IF NOT EXISTS idx_proposes_propose_code ON proposes (propose_code)")) + _ensure_unique_index(db, "proposes", "idx_proposes_propose_code", "propose_code") if _has_table(db, "essentials") and _has_column(db, "essentials", "essential_code"): - db.execute(text("CREATE UNIQUE INDEX IF NOT EXISTS idx_essentials_essential_code ON essentials (essential_code)")) + _ensure_unique_index(db, "essentials", "idx_essentials_essential_code", "essential_code") # --- server_states nginx telemetry for generic monitor client --- if _has_table(db, "server_states") and not _has_column(db, "server_states", "nginx_installed"):