"""Avatar 模型与非破坏命令历史 Revision ID: e66d791926f2 Revises: 4e679f11da46 Create Date: 2026-09-14 10:24:23.502856 """ from collections.abc import Sequence import sqlalchemy as sa from sqlalchemy.dialects import postgresql from alembic import op # revision identifiers, used by Alembic. revision: str = 'e66d791926f2' down_revision: str | Sequence[str] | None = '4e679f11da46' branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None def upgrade() -> None: """Upgrade schema.""" # ### commands auto generated by Alembic - please adjust! ### op.create_table('avatar_model', sa.Column('id', sa.String(), nullable=False), sa.Column('domain_id', sa.String(), nullable=False), sa.Column('character_id', sa.String(), nullable=True), sa.Column('name', sa.String(), nullable=False), sa.Column('format', sa.String(), nullable=False), sa.Column('file_id', sa.String(), nullable=False), sa.Column('status', sa.String(), nullable=False), sa.Column('validation_report', postgresql.JSONB(astext_type=sa.Text()), nullable=False), sa.Column('source_info', postgresql.JSONB(astext_type=sa.Text()), nullable=False), sa.Column('license_terms', sa.String(), nullable=True), sa.Column('current_command_id', sa.String(), nullable=True), sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), sa.CheckConstraint("format IN ('live2d', 'vrm', 'gltf')", name=op.f('ck_avatar_model_format_values')), sa.CheckConstraint("status IN ('pending', 'validated', 'rejected')", name=op.f('ck_avatar_model_status_values')), sa.ForeignKeyConstraint(['character_id'], ['character.id'], name=op.f('fk_avatar_model_character'), ondelete='set null'), sa.ForeignKeyConstraint(['current_command_id'], ['avatar_command.id'], name=op.f('fk_avatar_model_avatar_command'), ondelete='set null', use_alter=True), sa.ForeignKeyConstraint(['domain_id'], ['personal_domain.id'], name=op.f('fk_avatar_model_personal_domain'), ondelete='cascade'), sa.ForeignKeyConstraint(['file_id'], ['file_asset.id'], name=op.f('fk_avatar_model_file_asset'), ondelete='restrict'), sa.PrimaryKeyConstraint('id', name=op.f('pk_avatar_model')) ) op.create_index(op.f('ix_avatar_model_domain_id'), 'avatar_model', ['domain_id'], unique=False) op.create_table('avatar_command', sa.Column('id', sa.String(), nullable=False), sa.Column('avatar_id', sa.String(), nullable=False), sa.Column('sequence', sa.Integer(), nullable=False), sa.Column('command_type', sa.String(), nullable=False), sa.Column('payload', postgresql.JSONB(astext_type=sa.Text()), nullable=False), sa.Column('undone', sa.Boolean(), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), sa.CheckConstraint("command_type IN ('param_map', 'expression', 'physics', 'motion', 'material', 'texture', 'bone', 'attachment', 'lighting', 'camera')", name=op.f('ck_avatar_command_command_type_values')), sa.ForeignKeyConstraint(['avatar_id'], ['avatar_model.id'], name=op.f('fk_avatar_command_avatar_model'), ondelete='cascade'), sa.PrimaryKeyConstraint('id', name=op.f('pk_avatar_command')) ) op.create_index(op.f('ix_avatar_command_avatar_id'), 'avatar_command', ['avatar_id'], unique=False) op.create_index('uq_avatar_command_seq', 'avatar_command', ['avatar_id', 'sequence'], unique=True) # ### end Alembic commands ### def downgrade() -> None: """Downgrade schema.""" # ### commands auto generated by Alembic - please adjust! ### op.drop_index('uq_avatar_command_seq', table_name='avatar_command') op.drop_index(op.f('ix_avatar_command_avatar_id'), table_name='avatar_command') op.drop_table('avatar_command') op.drop_index(op.f('ix_avatar_model_domain_id'), table_name='avatar_model') op.drop_table('avatar_model') # ### end Alembic commands ###