"""迁移 029:扩容 PPT 模板资产标识并增加版本指纹。""" import logging import os from sqlalchemy import inspect, text logger = logging.getLogger(__name__) def migrate(): from insurance.db.compat import db columns = { item["name"]: item for item in inspect(db.engine).get_columns("insurance_ppt_templates") } dialect = db.engine.dialect.name if dialect == "postgresql": db.session.execute(text( "ALTER TABLE insurance_ppt_templates " "ALTER COLUMN source_template_asset_id TYPE VARCHAR(255)" )) elif dialect in {"mysql", "mariadb"}: db.session.execute(text( "ALTER TABLE insurance_ppt_templates " "MODIFY source_template_asset_id VARCHAR(255)" )) if "asset_sha256" not in columns: db.session.execute(text( "ALTER TABLE insurance_ppt_templates ADD COLUMN asset_sha256 VARCHAR(64)" )) if "asset_version" not in columns: db.session.execute(text( "ALTER TABLE insurance_ppt_templates " "ADD COLUMN asset_version INTEGER NOT NULL DEFAULT 1" )) from insurance.ppt.template_asset_service import ( resolve_template_asset, template_asset_sha256, ) rows = db.session.execute(text( "SELECT id, source_template_asset_id FROM insurance_ppt_templates " "WHERE source_template_asset_id IS NOT NULL" )).mappings().all() for row in rows: try: path = resolve_template_asset(row["source_template_asset_id"]) digest = template_asset_sha256(path) if path and os.path.isfile(path) else None except (OSError, ValueError): digest = None if digest: db.session.execute(text( "UPDATE insurance_ppt_templates " "SET asset_sha256 = :digest, asset_version = COALESCE(asset_version, 1) " "WHERE id = :id" ), {"digest": digest, "id": row["id"]}) db.session.execute(text( "UPDATE insurance_ppt_templates SET clone_renderer = 'clone-edit-v2' " "WHERE source_template_asset_id IS NOT NULL" )) db.session.commit() logger.info("[migrate_029] PPT 模板资产字段与指纹迁移完成")