"""V28 计提公式模板定义:模板入库,页面可维护;公式骨架仍受控。""" from pathlib import Path from alembic import op from sqlalchemy import inspect, text revision = "28a9b0c1d2e3" down_revision = "27f8a9b0c1d2" branch_labels = None depends_on = None def upgrade(): if not inspect(op.get_bind()).has_table("calc_template_definitions"): sql = Path(__file__).resolve().parents[3] / "db/migration/V28__calc_template_definitions.sql" raw = sql.read_text(encoding="utf-8") # MySQL 不支持 multi-statement;按分号+换行拆分成逐条执行。 # JSON_OBJECT 内不含分号+换行,可安全拆分。 for statement in raw.split(";\n"): stripped = "\n".join( line for line in statement.splitlines() if not line.lstrip().startswith("--") ).strip() if stripped: op.get_bind().execute(text(stripped)) def downgrade(): # 模板可能被岗位引用,外键不存在但编码被业务表保存;回退仅删定义表, # 已绑定岗位的编码会回退到代码注册表解析,不猜新数据归属。 op.drop_table("calc_template_definitions")