diff --git a/backend/routes/upgrade.py b/backend/routes/upgrade.py index 44c94a9..898ed16 100644 --- a/backend/routes/upgrade.py +++ b/backend/routes/upgrade.py @@ -297,13 +297,13 @@ async def _execute_sql_content(cursor, sql_content: str): current_block = [] continue elif stripped.upper() == 'DELIMITER ;': - # 执行累积的存储过程块 + # 执行缓冲区中剩余的存储过程 if current_block: proc_sql = '\n'.join(current_block).strip() if proc_sql: - # 移除存储过程结尾的 $$ 定界符(发送给 MySQL 服务器时不需要) proc_sql = re.sub(r'\$\$\s*$', '', proc_sql) - await cursor.execute(proc_sql) + if proc_sql: + await cursor.execute(proc_sql) in_procedure = False current_block = [] continue @@ -313,6 +313,15 @@ async def _execute_sql_content(cursor, sql_content: str): if in_procedure: current_block.append(line) + # 遇到 $$ 结尾的行,说明一个存储过程定义结束,立即执行 + if stripped.endswith('$$'): + proc_sql = '\n'.join(current_block).strip() + if proc_sql: + # 移除结尾的 $$ 定界符 + proc_sql = re.sub(r'\$\$\s*$', '', proc_sql) + if proc_sql: + await cursor.execute(proc_sql) + current_block = [] else: # 普通SQL,按完整语句分割(以分号结尾) if stripped: diff --git a/sql/upgrades/v2.1.sql b/sql/upgrades/v2.1.sql index f3ff3b9..c55ff2b 100644 --- a/sql/upgrades/v2.1.sql +++ b/sql/upgrades/v2.1.sql @@ -3,10 +3,13 @@ -- 主要内容:添加缺失的数据库索引,优化查询性能 -- =========================================== -DELIMITER $$ +-- =========================================== +-- 升级步骤 1: conduct_records 表添加 student_id + created_at 联合索引 +-- =========================================== --- conduct_records 表:添加 student_id + created_at 联合索引(学生端查询历史记录) -CREATE PROCEDURE upgrade_add_conduct_student_created_idx() +DROP PROCEDURE IF EXISTS `upgrade_add_conduct_student_created_idx`; +DELIMITER $$ +CREATE PROCEDURE `upgrade_add_conduct_student_created_idx`() BEGIN IF NOT EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.STATISTICS @@ -17,9 +20,18 @@ BEGIN ALTER TABLE `conduct_records` ADD INDEX `idx_student_created` (`student_id`, `created_at`); END IF; END$$ +DELIMITER ; --- conduct_records 表:添加 recorder_id 索引(班干查询自己记录的) -CREATE PROCEDURE upgrade_add_conduct_recorder_idx() +CALL `upgrade_add_conduct_student_created_idx`(); +DROP PROCEDURE IF EXISTS `upgrade_add_conduct_student_created_idx`; + +-- =========================================== +-- 升级步骤 2: conduct_records 表添加 recorder_id 索引 +-- =========================================== + +DROP PROCEDURE IF EXISTS `upgrade_add_conduct_recorder_idx`; +DELIMITER $$ +CREATE PROCEDURE `upgrade_add_conduct_recorder_idx`() BEGIN IF NOT EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.STATISTICS @@ -30,9 +42,18 @@ BEGIN ALTER TABLE `conduct_records` ADD INDEX `idx_recorder_id` (`recorder_id`); END IF; END$$ +DELIMITER ; --- attendance_records 表:添加 date 索引(按日期查询考勤记录) -CREATE PROCEDURE upgrade_add_attendance_date_idx() +CALL `upgrade_add_conduct_recorder_idx`(); +DROP PROCEDURE IF EXISTS `upgrade_add_conduct_recorder_idx`; + +-- =========================================== +-- 升级步骤 3: attendance_records 表添加 date 索引 +-- =========================================== + +DROP PROCEDURE IF EXISTS `upgrade_add_attendance_date_idx`; +DELIMITER $$ +CREATE PROCEDURE `upgrade_add_attendance_date_idx`() BEGIN IF NOT EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.STATISTICS @@ -43,9 +64,18 @@ BEGIN ALTER TABLE `attendance_records` ADD INDEX `idx_date` (`date`); END IF; END$$ +DELIMITER ; --- login_logs 表:添加 username + created_at 联合索引(查询登录历史) -CREATE PROCEDURE upgrade_add_login_username_created_idx() +CALL `upgrade_add_attendance_date_idx`(); +DROP PROCEDURE IF EXISTS `upgrade_add_attendance_date_idx`; + +-- =========================================== +-- 升级步骤 4: login_logs 表添加 username + created_at 联合索引 +-- =========================================== + +DROP PROCEDURE IF EXISTS `upgrade_add_login_username_created_idx`; +DELIMITER $$ +CREATE PROCEDURE `upgrade_add_login_username_created_idx`() BEGIN IF NOT EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.STATISTICS @@ -56,9 +86,18 @@ BEGIN ALTER TABLE `login_logs` ADD INDEX `idx_username_created` (`username`, `created_at`); END IF; END$$ +DELIMITER ; --- operation_logs 表:添加 operator_id + created_at 联合索引(查询操作历史) -CREATE PROCEDURE upgrade_add_operation_operator_created_idx() +CALL `upgrade_add_login_username_created_idx`(); +DROP PROCEDURE IF EXISTS `upgrade_add_login_username_created_idx`; + +-- =========================================== +-- 升级步骤 5: operation_logs 表添加 operator_id + created_at 联合索引 +-- =========================================== + +DROP PROCEDURE IF EXISTS `upgrade_add_operation_operator_created_idx`; +DELIMITER $$ +CREATE PROCEDURE `upgrade_add_operation_operator_created_idx`() BEGIN IF NOT EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.STATISTICS @@ -69,9 +108,18 @@ BEGIN ALTER TABLE `operation_logs` ADD INDEX `idx_operator_created` (`operator_id`, `created_at`); END IF; END$$ +DELIMITER ; --- semester_archives 表:添加 semester_id 索引(查询学期归档数据) -CREATE PROCEDURE upgrade_add_archive_semester_idx() +CALL `upgrade_add_operation_operator_created_idx`(); +DROP PROCEDURE IF EXISTS `upgrade_add_operation_operator_created_idx`; + +-- =========================================== +-- 升级步骤 6: semester_archives 表添加 semester_id 索引 +-- =========================================== + +DROP PROCEDURE IF EXISTS `upgrade_add_archive_semester_idx`; +DELIMITER $$ +CREATE PROCEDURE `upgrade_add_archive_semester_idx`() BEGIN IF NOT EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.STATISTICS @@ -82,21 +130,7 @@ BEGIN ALTER TABLE `semester_archives` ADD INDEX `idx_semester_id` (`semester_id`); END IF; END$$ - DELIMITER ; --- 执行所有升级存储过程 -CALL upgrade_add_conduct_student_created_idx(); -CALL upgrade_add_conduct_recorder_idx(); -CALL upgrade_add_attendance_date_idx(); -CALL upgrade_add_login_username_created_idx(); -CALL upgrade_add_operation_operator_created_idx(); -CALL upgrade_add_archive_semester_idx(); - --- 清理存储过程 -DROP PROCEDURE IF EXISTS upgrade_add_conduct_student_created_idx; -DROP PROCEDURE IF EXISTS upgrade_add_conduct_recorder_idx; -DROP PROCEDURE IF EXISTS upgrade_add_attendance_date_idx; -DROP PROCEDURE IF EXISTS upgrade_add_login_username_created_idx; -DROP PROCEDURE IF EXISTS upgrade_add_operation_operator_created_idx; -DROP PROCEDURE IF EXISTS upgrade_add_archive_semester_idx; +CALL `upgrade_add_archive_semester_idx`(); +DROP PROCEDURE IF EXISTS `upgrade_add_archive_semester_idx`;