109 lines
5.8 KiB
Python
109 lines
5.8 KiB
Python
"""镜生域:灵胚、执镜关系、命台、魂籍表与人物增量列
|
|
|
|
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 ###
|