From 65bab7e25c857c131e627c2975c9b02e640959bb Mon Sep 17 00:00:00 2001 From: butubb <1422726308@qq.com> Date: Wed, 9 Sep 2026 14:16:15 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20schema=20=E8=BF=81=E7=A7=BB=E5=B9=82?= =?UTF-8?q?=E7=AD=89=E5=85=9C=E5=BA=95=E2=80=94=E2=80=94create=5Fall=20?= =?UTF-8?q?=E5=B7=B2=E5=BB=BA=E5=88=97=E8=80=8C=20schema=5Fversion=20?= =?UTF-8?q?=E6=9C=AA=E8=AE=B0=E5=BD=95=E6=97=B6=E9=87=8D=E5=A4=8D=20ALTER?= =?UTF-8?q?=20=E6=8A=A5=20duplicate=20column=EF=BC=8C=E9=81=87=E9=94=99?= =?UTF-8?q?=E5=9B=9E=E6=BB=9A=E5=B9=B6=E7=85=A7=E8=AE=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E8=87=AA=E6=84=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 典型场景:create_all 已按当前模型把列/表直接建好(如 perms、device.model), 而 schema_version 又因历史中断没记录,导致每次启动重复 ALTER 报错。 duplicate column name 说明列已存在=迁移目标已达成:回滚本次语句后仍记录 版本号,一次启动即自愈;其它异常才中止本批迁移。 --- core/models.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) 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)})