diff --git a/core/models.py b/core/models.py index d880a7d..cff3af0 100644 --- a/core/models.py +++ b/core/models.py @@ -305,7 +305,18 @@ def _migrate_schema(): if version <= current: continue 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( text("INSERT OR REPLACE INTO app_meta(key,value) VALUES('schema_version',:v)"), {"v": str(version)})