v2.3修复
This commit is contained in:
@@ -37,6 +37,64 @@ ALL_VERSIONS = {
|
||||
'2.3': 'v2.3.sql',
|
||||
}
|
||||
|
||||
# 版本特征标记(按优先级从高到低)
|
||||
VERSION_MARKERS = [
|
||||
('2.0', 'students', 'dormitory_number'),
|
||||
('1.8', 'conduct_records', 'related_type'),
|
||||
('1.7', 'subjects', 'sort_order'),
|
||||
]
|
||||
|
||||
|
||||
async def _detect_current_version() -> str:
|
||||
"""检测当前数据库版本,优先从 system_settings 读取,否则通过列特征推断"""
|
||||
# 1. 尝试从 system_settings 读取 db_version
|
||||
try:
|
||||
row = await execute_query(
|
||||
"SELECT setting_value FROM system_settings WHERE setting_key = 'db_version'"
|
||||
)
|
||||
if row:
|
||||
return row[0]['setting_value']
|
||||
except Exception as e:
|
||||
logger.warning(f"查询 system_settings 表失败,将通过列特征推断版本: {e}")
|
||||
|
||||
# 2. 通过列特征推断版本
|
||||
inferred_version = '1.0'
|
||||
for version, table, column in VERSION_MARKERS:
|
||||
try:
|
||||
result = await execute_query(
|
||||
"SELECT COUNT(*) as cnt FROM INFORMATION_SCHEMA.COLUMNS "
|
||||
"WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = %s AND COLUMN_NAME = %s",
|
||||
(table, column)
|
||||
)
|
||||
if result and result[0]['cnt'] > 0:
|
||||
inferred_version = version
|
||||
break
|
||||
except Exception as e:
|
||||
logger.warning(f"检查列特征失败 ({table}.{column}): {e}")
|
||||
|
||||
logger.info(f"通过列特征推断数据库版本为: {inferred_version}")
|
||||
|
||||
# 3. 确保 system_settings 表存在并写入推断版本
|
||||
try:
|
||||
await execute_update(
|
||||
"CREATE TABLE IF NOT EXISTS `system_settings` ("
|
||||
"`setting_key` VARCHAR(50) PRIMARY KEY,"
|
||||
"`setting_value` VARCHAR(255) NOT NULL,"
|
||||
"`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"
|
||||
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"
|
||||
)
|
||||
await execute_update(
|
||||
"INSERT INTO system_settings (setting_key, setting_value) VALUES ('db_version', %s) "
|
||||
"ON DUPLICATE KEY UPDATE setting_value = %s",
|
||||
(inferred_version, inferred_version)
|
||||
)
|
||||
logger.info(f"已将推断版本 {inferred_version} 写入 system_settings")
|
||||
except Exception as e:
|
||||
logger.error(f"写入推断版本失败: {e}")
|
||||
|
||||
return inferred_version
|
||||
|
||||
|
||||
@router.get("/check")
|
||||
async def check_upgrade(request: Request):
|
||||
"""检查数据库版本是否需要升级"""
|
||||
@@ -51,16 +109,8 @@ async def check_upgrade(request: Request):
|
||||
if not is_teacher:
|
||||
return error_response(message="仅班主任可执行升级操作", code=403)
|
||||
|
||||
# 检测当前数据库版本
|
||||
current_version = '0.0.0'
|
||||
try:
|
||||
row = await execute_query(
|
||||
"SELECT setting_value FROM system_settings WHERE setting_key = 'db_version'"
|
||||
)
|
||||
if row:
|
||||
current_version = row[0]['setting_value']
|
||||
except Exception:
|
||||
pass # 表不存在时使用默认值
|
||||
# 检测当前数据库版本(支持自动推断)
|
||||
current_version = await _detect_current_version()
|
||||
|
||||
# 读取目标版本(从 VERSION 文件)
|
||||
version_file = os.path.join(os.path.dirname(os.path.dirname(__file__)), '..', 'VERSION')
|
||||
|
||||
Reference in New Issue
Block a user