"""add asset image lifecycle fields Revision ID: a41e8c7f4b20 Revises: 658b0503f71c Create Date: 2026-08-30 09:00:00 """ from __future__ import annotations from alembic import op import sqlalchemy as sa revision = "a41e8c7f4b20" down_revision = "658b0503f71c" branch_labels = None depends_on = None def upgrade() -> None: op.add_column("product_assets", sa.Column("original_url", sa.Text(), nullable=True)) op.add_column("product_assets", sa.Column("original_storage_key", sa.String(length=1024), nullable=True)) op.add_column("product_assets", sa.Column("current_storage_key", sa.String(length=1024), nullable=True)) op.add_column("product_assets", sa.Column("watermark_enabled", sa.Boolean(), nullable=False, server_default=sa.false())) op.add_column("product_assets", sa.Column("watermark_config", sa.JSON(), nullable=True)) # 兼容旧数据:采集图优先以已转存文件为原图;生成图若此前已保存 source_url,则它是无水印原图。 op.execute( """ UPDATE product_assets SET original_url = CASE WHEN group_key = 'generated' AND source_url IS NOT NULL AND source_url <> '' THEN source_url ELSE COALESCE(stored_url, source_url) END """ ) def downgrade() -> None: op.drop_column("product_assets", "watermark_config") op.drop_column("product_assets", "watermark_enabled") op.drop_column("product_assets", "current_storage_key") op.drop_column("product_assets", "original_storage_key") op.drop_column("product_assets", "original_url")