From 0a6f753584dbd010a25f36df98cef6ebe230bf2c Mon Sep 17 00:00:00 2001 From: Pine Date: Mon, 31 Aug 2026 23:45:03 +0800 Subject: [PATCH] =?UTF-8?q?fix(db):=20=E8=A1=A5=E5=9B=9E=20system=5Fconfig?= =?UTF-8?q?s.description=20=E5=88=97=EF=BC=88=E4=BF=AE=E5=A4=8D=20/admin/c?= =?UTF-8?q?onfig=20500=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 此前 MySQL 适配时模型编辑误删 description,导致仓储序列化 AttributeError - 0037_system_config_description:幂等补列(SQLite 已有则跳过)并回填存量说明 - 与并行的 0037_market 分叉建 merge 版本,统一迁移线(当前 head=02d10eccb1f9) --- .../0037_system_config_description.py | 44 +++++++++++++++++++ ...0eccb1f9_merge_market_与_system_config_.py | 25 +++++++++++ app/infrastructure/models.py | 1 + 3 files changed, 70 insertions(+) create mode 100644 alembic/versions/0037_system_config_description.py create mode 100644 alembic/versions/02d10eccb1f9_merge_market_与_system_config_.py diff --git a/alembic/versions/0037_system_config_description.py b/alembic/versions/0037_system_config_description.py new file mode 100644 index 0000000..cb33d8d --- /dev/null +++ b/alembic/versions/0037_system_config_description.py @@ -0,0 +1,44 @@ +"""补回 system_configs.description(此前模型编辑误删,导致 /admin/config 500)。 + +Revision ID: 0037_system_config_description +Revises: 0036_service_orders +Create Date: 2026-08-31 +""" +from __future__ import annotations + +import sqlalchemy as sa +from alembic import op + +revision = "0037_system_config_description" +down_revision = "0036_service_orders" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + """SQLite 已有该列 → 仅 MySQL/缺失时补;幂等(查列存在性)。""" + bind = op.get_bind() + insp = sa.inspect(bind) + cols = [c["name"] for c in insp.get_columns("system_configs")] + if "description" not in cols: + op.add_column("system_configs", sa.Column("description", sa.String(), nullable=True, server_default="")) + # 从 SQLite 备份源回填说明(如存在) + try: + import sqlite3 + from pathlib import Path + db_path = Path("serverdata/data/app.db") + if db_path.exists(): + sconn = sqlite3.connect(str(db_path)) + rows = sconn.execute("SELECT key, description FROM system_configs").fetchall() + sconn.close() + from sqlalchemy import text + for k, d in rows: + if d: + bind.execute(text("UPDATE system_configs SET description=:d WHERE `key`=:k"), + {"d": d, "k": k}) + except Exception: # noqa: BLE001 回填失败不阻塞 + pass + + +def downgrade() -> None: + pass # 保留列(回滚会造成数据丢失) diff --git a/alembic/versions/02d10eccb1f9_merge_market_与_system_config_.py b/alembic/versions/02d10eccb1f9_merge_market_与_system_config_.py new file mode 100644 index 0000000..e050054 --- /dev/null +++ b/alembic/versions/02d10eccb1f9_merge_market_与_system_config_.py @@ -0,0 +1,25 @@ +"""merge market 与 system_config_description 分支 + +Revision ID: 02d10eccb1f9 +Revises: 0037_market, 0037_system_config_description +Create Date: 2026-08-31 23:44:52.597833 + +""" +from __future__ import annotations + +import sqlalchemy as sa +from alembic import op + + +revision = '02d10eccb1f9' +down_revision = ('0037_market', '0037_system_config_description') +branch_labels = None +depends_on = None + + +def upgrade() -> None: + pass + + +def downgrade() -> None: + pass diff --git a/app/infrastructure/models.py b/app/infrastructure/models.py index dd5fe92..bf454f0 100644 --- a/app/infrastructure/models.py +++ b/app/infrastructure/models.py @@ -388,6 +388,7 @@ class SystemConfig(Base): key: Mapped[str] = mapped_column(String, primary_key=True) value: Mapped[str] = mapped_column(Text, default="") # 配置值(存量可达 300+ 字节,MySQL 用 MEDIUMTEXT) + description: Mapped[str] = mapped_column(String, default="") # 配置说明(0037 补回:此前模型误删) updated_at: Mapped[str] = mapped_column(String, default="")