1
This commit is contained in:
+202
@@ -0,0 +1,202 @@
|
||||
"""rename private portrait asset limit and add library type
|
||||
|
||||
Revision ID: cd7688999204
|
||||
Revises: e7038d02c355
|
||||
Create Date: 2026-07-07 13:21:49.612465
|
||||
"""
|
||||
from typing import Sequence, Union
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = "cd7688999204"
|
||||
down_revision: Union[str, None] = "e7038d02c355"
|
||||
branch_labels: Union[str, Sequence[str], None] = None
|
||||
depends_on: Union[str, Sequence[str], None] = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
# 1. users 字段改名:必须 rename,保留原有用户额度数据
|
||||
op.alter_column(
|
||||
"users",
|
||||
"private_portrait_image_limit",
|
||||
new_column_name="private_portrait_asset_limit",
|
||||
existing_type=sa.Integer(),
|
||||
existing_nullable=False,
|
||||
existing_server_default=sa.text("5"),
|
||||
comment="私域人像素材总量限制,真人/虚拟共用,图片/视频共用,0 表示关闭",
|
||||
existing_comment="私域真人图片素材数量限制,0表示关闭",
|
||||
)
|
||||
|
||||
# 2. private_portrait_asset_groups
|
||||
op.add_column(
|
||||
"private_portrait_asset_groups",
|
||||
sa.Column(
|
||||
"library_type",
|
||||
sa.String(length=32),
|
||||
server_default="real_person",
|
||||
nullable=False,
|
||||
comment="素材库类型:real_person 真人认证;aigc_virtual 虚拟人像",
|
||||
),
|
||||
)
|
||||
op.create_index(
|
||||
"idx_private_portrait_asset_groups_library_type",
|
||||
"private_portrait_asset_groups",
|
||||
["library_type"],
|
||||
unique=False,
|
||||
)
|
||||
op.create_index(
|
||||
"idx_private_portrait_asset_groups_user_library",
|
||||
"private_portrait_asset_groups",
|
||||
["user_id", "library_type"],
|
||||
unique=False,
|
||||
)
|
||||
|
||||
# 3. private_portrait_assets
|
||||
op.add_column(
|
||||
"private_portrait_assets",
|
||||
sa.Column(
|
||||
"library_type",
|
||||
sa.String(length=32),
|
||||
server_default="real_person",
|
||||
nullable=False,
|
||||
comment="素材库类型:real_person 真人认证;aigc_virtual 虚拟人像",
|
||||
),
|
||||
)
|
||||
op.add_column(
|
||||
"private_portrait_assets",
|
||||
sa.Column("video_duration", sa.Float(), nullable=True, comment="视频素材时长,秒"),
|
||||
)
|
||||
op.add_column(
|
||||
"private_portrait_assets",
|
||||
sa.Column("video_cover_url", sa.Text(), nullable=True, comment="视频素材封面预览地址"),
|
||||
)
|
||||
op.add_column(
|
||||
"private_portrait_assets",
|
||||
sa.Column("file_size", sa.Integer(), nullable=True, comment="素材文件大小,字节"),
|
||||
)
|
||||
op.add_column(
|
||||
"private_portrait_assets",
|
||||
sa.Column("mime_type", sa.String(length=128), nullable=True, comment="素材 MIME 类型"),
|
||||
)
|
||||
|
||||
# 如果 private_portrait_assets.asset_type 已经存在索引,这条要删除
|
||||
op.create_index(
|
||||
"idx_private_portrait_assets_asset_type",
|
||||
"private_portrait_assets",
|
||||
["asset_type"],
|
||||
unique=False,
|
||||
)
|
||||
op.create_index(
|
||||
"idx_private_portrait_assets_library_type",
|
||||
"private_portrait_assets",
|
||||
["library_type"],
|
||||
unique=False,
|
||||
)
|
||||
op.create_index(
|
||||
"idx_private_portrait_assets_user_library_status_created",
|
||||
"private_portrait_assets",
|
||||
["user_id", "library_type", "status", "created_at"],
|
||||
unique=False,
|
||||
)
|
||||
|
||||
# 4. private_portrait_projects
|
||||
op.add_column(
|
||||
"private_portrait_projects",
|
||||
sa.Column(
|
||||
"library_type",
|
||||
sa.String(length=32),
|
||||
server_default="real_person",
|
||||
nullable=False,
|
||||
comment="素材库类型:real_person 真人认证;aigc_virtual 虚拟人像",
|
||||
),
|
||||
)
|
||||
op.add_column(
|
||||
"private_portrait_projects",
|
||||
sa.Column("image_asset_count", sa.Integer(), server_default="0", nullable=False, comment="图片素材数量"),
|
||||
)
|
||||
op.add_column(
|
||||
"private_portrait_projects",
|
||||
sa.Column("video_asset_count", sa.Integer(), server_default="0", nullable=False, comment="视频素材数量"),
|
||||
)
|
||||
op.add_column(
|
||||
"private_portrait_projects",
|
||||
sa.Column("active_image_asset_count", sa.Integer(), server_default="0", nullable=False, comment="可用图片素材数量"),
|
||||
)
|
||||
op.add_column(
|
||||
"private_portrait_projects",
|
||||
sa.Column("active_video_asset_count", sa.Integer(), server_default="0", nullable=False, comment="可用视频素材数量"),
|
||||
)
|
||||
op.create_index(
|
||||
"idx_private_portrait_projects_library_type",
|
||||
"private_portrait_projects",
|
||||
["library_type"],
|
||||
unique=False,
|
||||
)
|
||||
op.create_index(
|
||||
"idx_private_portrait_projects_user_library_status_created",
|
||||
"private_portrait_projects",
|
||||
["user_id", "library_type", "status", "created_at"],
|
||||
unique=False,
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
# 1. users 字段反向改名:保留数据
|
||||
op.alter_column(
|
||||
"users",
|
||||
"private_portrait_asset_limit",
|
||||
new_column_name="private_portrait_image_limit",
|
||||
existing_type=sa.Integer(),
|
||||
existing_nullable=False,
|
||||
existing_server_default=sa.text("5"),
|
||||
comment="私域真人图片素材数量限制,0表示关闭",
|
||||
existing_comment="私域人像素材总量限制,真人/虚拟共用,图片/视频共用,0 表示关闭",
|
||||
)
|
||||
|
||||
# 2. private_portrait_projects
|
||||
op.drop_index(
|
||||
"idx_private_portrait_projects_user_library_status_created",
|
||||
table_name="private_portrait_projects",
|
||||
)
|
||||
op.drop_index(
|
||||
"idx_private_portrait_projects_library_type",
|
||||
table_name="private_portrait_projects",
|
||||
)
|
||||
op.drop_column("private_portrait_projects", "active_video_asset_count")
|
||||
op.drop_column("private_portrait_projects", "active_image_asset_count")
|
||||
op.drop_column("private_portrait_projects", "video_asset_count")
|
||||
op.drop_column("private_portrait_projects", "image_asset_count")
|
||||
op.drop_column("private_portrait_projects", "library_type")
|
||||
|
||||
# 3. private_portrait_assets
|
||||
op.drop_index(
|
||||
"idx_private_portrait_assets_user_library_status_created",
|
||||
table_name="private_portrait_assets",
|
||||
)
|
||||
op.drop_index(
|
||||
"idx_private_portrait_assets_library_type",
|
||||
table_name="private_portrait_assets",
|
||||
)
|
||||
op.drop_index(
|
||||
"idx_private_portrait_assets_asset_type",
|
||||
table_name="private_portrait_assets",
|
||||
)
|
||||
op.drop_column("private_portrait_assets", "mime_type")
|
||||
op.drop_column("private_portrait_assets", "file_size")
|
||||
op.drop_column("private_portrait_assets", "video_cover_url")
|
||||
op.drop_column("private_portrait_assets", "video_duration")
|
||||
op.drop_column("private_portrait_assets", "library_type")
|
||||
|
||||
# 4. private_portrait_asset_groups
|
||||
op.drop_index(
|
||||
"idx_private_portrait_asset_groups_user_library",
|
||||
table_name="private_portrait_asset_groups",
|
||||
)
|
||||
op.drop_index(
|
||||
"idx_private_portrait_asset_groups_library_type",
|
||||
table_name="private_portrait_asset_groups",
|
||||
)
|
||||
op.drop_column("private_portrait_asset_groups", "library_type")
|
||||
Reference in New Issue
Block a user