"""镜生域:灵胚、执镜关系、命台、魂籍表与人物增量列 Revision ID: 001 Revises: 000 Create Date: 2026-08-21 22:23:35.864890 """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa # revision identifiers, used by Alembic. revision: str = '001' down_revision: Union[str, Sequence[str], None] = '000' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: """Upgrade schema.""" # ### commands auto generated by Alembic - please adjust! ### op.create_table('embryo_drafts', sa.Column('id', sa.String(length=80), nullable=False), sa.Column('owner_scope', sa.String(length=80), nullable=False), sa.Column('status', sa.String(length=40), nullable=False), sa.Column('source', sa.String(length=40), nullable=False), sa.Column('name', sa.String(length=120), nullable=False), sa.Column('description', sa.Text(), nullable=True), sa.Column('identity_baseline_json', sa.Text(), nullable=False), sa.Column('rehearsals_json', sa.Text(), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_embryo_drafts_owner_scope'), 'embryo_drafts', ['owner_scope'], unique=False) op.create_index(op.f('ix_embryo_drafts_status'), 'embryo_drafts', ['status'], unique=False) op.create_table('custodianships', sa.Column('id', sa.String(length=80), nullable=False), sa.Column('character_id', sa.String(length=80), nullable=False), sa.Column('custodian_scope', sa.String(length=80), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), sa.ForeignKeyConstraint(['character_id'], ['characters.id'], ), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_custodianships_character_id'), 'custodianships', ['character_id'], unique=True) op.create_index(op.f('ix_custodianships_custodian_scope'), 'custodianships', ['custodian_scope'], unique=False) op.create_table('identity_records', sa.Column('id', sa.String(length=80), nullable=False), sa.Column('character_id', sa.String(length=80), nullable=False), sa.Column('version', sa.Integer(), nullable=False), sa.Column('payload_json', sa.Text(), nullable=False), sa.Column('digest', sa.String(length=64), nullable=False), sa.Column('signature', sa.String(length=128), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), sa.ForeignKeyConstraint(['character_id'], ['characters.id'], ), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('character_id', 'version', name='uq_identity_char_version') ) op.create_index(op.f('ix_identity_records_character_id'), 'identity_records', ['character_id'], unique=False) op.create_table('runtime_seats', sa.Column('id', sa.String(length=80), nullable=False), sa.Column('character_id', sa.String(length=80), nullable=False), sa.Column('epoch', sa.Integer(), nullable=False), sa.Column('holder', sa.String(length=120), nullable=True), sa.Column('lease_expires_at', sa.DateTime(timezone=True), nullable=True), sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False), sa.ForeignKeyConstraint(['character_id'], ['characters.id'], ), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_runtime_seats_character_id'), 'runtime_seats', ['character_id'], unique=True) op.add_column('characters', sa.Column('source', sa.String(length=40), server_default='original', nullable=False)) op.add_column('characters', sa.Column('identity_baseline_json', sa.Text(), server_default='{}', nullable=False)) op.add_column('characters', sa.Column('death_requested_at', sa.DateTime(timezone=True), nullable=True)) op.add_column('characters', sa.Column('calm_period_until', sa.DateTime(timezone=True), nullable=True)) op.add_column('characters', sa.Column('died_at', sa.DateTime(timezone=True), nullable=True)) op.create_index(op.f('ix_characters_source'), 'characters', ['source'], unique=False) op.add_column('runs', sa.Column('kind', sa.String(length=40), server_default='foreground', nullable=False)) # SQLite 不支持 ALTER COLUMN,用 batch 模式跨方言改 runs.character_id 可空(试演 Run 无人物) with op.batch_alter_table('runs') as batch_op: batch_op.alter_column('character_id', existing_type=sa.String(length=80), nullable=True) # ### end Alembic commands ### def downgrade() -> None: """Downgrade schema.""" # ### commands auto generated by Alembic - please adjust! ### with op.batch_alter_table('runs') as batch_op: batch_op.alter_column('character_id', existing_type=sa.String(length=80), nullable=False) op.drop_column('runs', 'kind') op.drop_index(op.f('ix_characters_source'), table_name='characters') op.drop_column('characters', 'died_at') op.drop_column('characters', 'calm_period_until') op.drop_column('characters', 'death_requested_at') op.drop_column('characters', 'identity_baseline_json') op.drop_column('characters', 'source') op.drop_index(op.f('ix_runtime_seats_character_id'), table_name='runtime_seats') op.drop_table('runtime_seats') op.drop_index(op.f('ix_identity_records_character_id'), table_name='identity_records') op.drop_table('identity_records') op.drop_index(op.f('ix_custodianships_custodian_scope'), table_name='custodianships') op.drop_index(op.f('ix_custodianships_character_id'), table_name='custodianships') op.drop_table('custodianships') op.drop_index(op.f('ix_embryo_drafts_status'), table_name='embryo_drafts') op.drop_index(op.f('ix_embryo_drafts_owner_scope'), table_name='embryo_drafts') op.drop_table('embryo_drafts') # ### end Alembic commands ###