fix: schema 迁移幂等兜底——create_all 已建列而 schema_version 未记录时重复 ALTER 报 duplicate column,遇错回滚并照记版本自愈
典型场景:create_all 已按当前模型把列/表直接建好(如 perms、device.model), 而 schema_version 又因历史中断没记录,导致每次启动重复 ALTER 报错。 duplicate column name 说明列已存在=迁移目标已达成:回滚本次语句后仍记录 版本号,一次启动即自愈;其它异常才中止本批迁移。
This commit is contained in:
+12
-1
@@ -305,7 +305,18 @@ def _migrate_schema():
|
|||||||
if version <= current:
|
if version <= current:
|
||||||
continue
|
continue
|
||||||
if sql:
|
if sql:
|
||||||
db.session.execute(text(sql))
|
try:
|
||||||
|
db.session.execute(text(sql))
|
||||||
|
except Exception as e:
|
||||||
|
# 幂等兜底:目标结构已存在也视为该迁移生效。典型场景——
|
||||||
|
# create_all 已按当前模型把列/表直接建好(如 perms、device.model),
|
||||||
|
# 而 schema_version 又因历史中断没记录,导致每次启动重复 ALTER 报错。
|
||||||
|
# duplicate column name 说明列已存在=迁移目标已达成:回滚本次语句后
|
||||||
|
# 仍记录版本号,一次启动即自愈;其它异常才中止本批迁移。
|
||||||
|
if "duplicate column name" not in str(e).lower():
|
||||||
|
raise
|
||||||
|
db.session.rollback()
|
||||||
|
_log.info(f"schema 迁移 {version} 目标已存在,跳过: {desc}")
|
||||||
db.session.execute(
|
db.session.execute(
|
||||||
text("INSERT OR REPLACE INTO app_meta(key,value) VALUES('schema_version',:v)"),
|
text("INSERT OR REPLACE INTO app_meta(key,value) VALUES('schema_version',:v)"),
|
||||||
{"v": str(version)})
|
{"v": str(version)})
|
||||||
|
|||||||
Reference in New Issue
Block a user