"""记忆与知识:候选、版本、大周天 Revision ID: a994e5b4337b Revises: 1c1f7edb7cbe Create Date: 2026-09-11 10:48:52.696975 """ 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 = 'a994e5b4337b' down_revision: str | Sequence[str] | None = '1c1f7edb7cbe' 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('big_cycle', sa.Column('id', sa.String(), nullable=False), sa.Column('character_id', sa.String(), nullable=False), sa.Column('status', sa.String(), nullable=False), sa.Column('trigger', postgresql.JSONB(astext_type=sa.Text()), nullable=False), sa.Column('phase_memory', postgresql.JSONB(astext_type=sa.Text()), nullable=False), sa.Column('produced_version_ids', postgresql.JSONB(astext_type=sa.Text()), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), sa.Column('completed_at', sa.DateTime(timezone=True), nullable=True), sa.CheckConstraint("status IN ('pending', 'running', 'completed', 'failed')", name=op.f('ck_big_cycle_status_values')), sa.ForeignKeyConstraint(['character_id'], ['character.id'], name=op.f('fk_big_cycle_character'), ondelete='cascade'), sa.PrimaryKeyConstraint('id', name=op.f('pk_big_cycle')) ) op.create_index(op.f('ix_big_cycle_character_id'), 'big_cycle', ['character_id'], unique=False) op.create_table('memory', sa.Column('id', sa.String(), nullable=False), sa.Column('owner_personal_domain_id', sa.String(), nullable=False), sa.Column('character_id', sa.String(), nullable=True), sa.Column('kind', sa.String(), nullable=False), sa.Column('sensitivity', sa.String(), nullable=False), sa.Column('realm', sa.String(), nullable=False), sa.Column('status', sa.String(), nullable=False), sa.Column('valid_from', sa.DateTime(timezone=True), nullable=True), sa.Column('expires_at', sa.DateTime(timezone=True), nullable=True), sa.Column('pinned', sa.Boolean(), nullable=False), sa.Column('current_version_id', sa.String(), nullable=True), sa.Column('resource_version', sa.Integer(), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), sa.CheckConstraint("kind IN ('fact', 'preference', 'event', 'relationship')", name=op.f('ck_memory_candidate_kind_values')), sa.CheckConstraint("realm IN ('reality', 'world', 'simulation')", name=op.f('ck_memory_candidate_realm_values')), sa.CheckConstraint("sensitivity IN ('none', 'low', 'medium', 'high')", name=op.f('ck_memory_candidate_sensitivity_values')), sa.CheckConstraint("status IN ('active', 'superseded', 'archived', 'deleted')", name=op.f('ck_memory_status_values')), sa.ForeignKeyConstraint(['character_id'], ['character.id'], name=op.f('fk_memory_character'), ondelete='cascade'), sa.ForeignKeyConstraint(['current_version_id'], ['memory_version.id'], name=op.f('fk_memory_memory_version'), ondelete='set null', use_alter=True), sa.ForeignKeyConstraint(['owner_personal_domain_id'], ['personal_domain.id'], name=op.f('fk_memory_personal_domain'), ondelete='cascade'), sa.PrimaryKeyConstraint('id', name=op.f('pk_memory')) ) op.create_index(op.f('ix_memory_character_id'), 'memory', ['character_id'], unique=False) op.create_index('ix_memory_domain_status_kind', 'memory', ['owner_personal_domain_id', 'status', 'kind'], unique=False) op.create_index(op.f('ix_memory_owner_personal_domain_id'), 'memory', ['owner_personal_domain_id'], unique=False) op.create_table('memory_candidate', sa.Column('id', sa.String(), nullable=False), sa.Column('owner_personal_domain_id', sa.String(), nullable=False), sa.Column('character_id', sa.String(), nullable=True), sa.Column('kind', sa.String(), nullable=False), sa.Column('sensitivity', sa.String(), nullable=False), sa.Column('realm', sa.String(), nullable=False), sa.Column('payload', postgresql.JSONB(astext_type=sa.Text()), nullable=False), sa.Column('source', sa.String(), nullable=False), sa.Column('source_ref', postgresql.JSONB(astext_type=sa.Text()), nullable=False), sa.Column('content_hash', sa.String(), nullable=True), sa.Column('status', sa.String(), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), sa.Column('decided_at', sa.DateTime(timezone=True), nullable=True), sa.CheckConstraint("kind IN ('fact', 'preference', 'event', 'relationship')", name=op.f('ck_memory_candidate_kind_values')), sa.CheckConstraint("realm IN ('reality', 'world', 'simulation')", name=op.f('ck_memory_candidate_realm_values')), sa.CheckConstraint("sensitivity IN ('none', 'low', 'medium', 'high')", name=op.f('ck_memory_candidate_sensitivity_values')), sa.CheckConstraint("source IN ('manual', 'auto', 'big_cycle', 'canonization')", name=op.f('ck_memory_candidate_source_values')), sa.CheckConstraint("status IN ('pending', 'approved', 'rejected', 'expired')", name=op.f('ck_memory_candidate_status_values')), sa.ForeignKeyConstraint(['character_id'], ['character.id'], name=op.f('fk_memory_candidate_character'), ondelete='cascade'), sa.ForeignKeyConstraint(['owner_personal_domain_id'], ['personal_domain.id'], name=op.f('fk_memory_candidate_personal_domain'), ondelete='cascade'), sa.PrimaryKeyConstraint('id', name=op.f('pk_memory_candidate')) ) op.create_index(op.f('ix_memory_candidate_owner_personal_domain_id'), 'memory_candidate', ['owner_personal_domain_id'], unique=False) op.create_table('memory_version', sa.Column('id', sa.String(), nullable=False), sa.Column('memory_id', sa.String(), nullable=False), sa.Column('version', sa.Integer(), nullable=False), sa.Column('payload', postgresql.JSONB(astext_type=sa.Text()), nullable=False), sa.Column('supersedes_version_id', sa.String(), nullable=True), sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), sa.ForeignKeyConstraint(['memory_id'], ['memory.id'], name=op.f('fk_memory_version_memory'), ondelete='cascade'), sa.ForeignKeyConstraint(['supersedes_version_id'], ['memory_version.id'], name=op.f('fk_memory_version_memory_version'), ondelete='set null'), sa.PrimaryKeyConstraint('id', name=op.f('pk_memory_version')) ) op.create_index(op.f('ix_memory_version_memory_id'), 'memory_version', ['memory_id'], unique=False) op.create_index('uq_memory_version_number', 'memory_version', ['memory_id', 'version'], unique=True) # ### end Alembic commands ### def downgrade() -> None: """Downgrade schema.""" # ### commands auto generated by Alembic - please adjust! ### op.drop_index('uq_memory_version_number', table_name='memory_version') op.drop_index(op.f('ix_memory_version_memory_id'), table_name='memory_version') op.drop_table('memory_version') op.drop_index(op.f('ix_memory_candidate_owner_personal_domain_id'), table_name='memory_candidate') op.drop_table('memory_candidate') op.drop_index(op.f('ix_memory_owner_personal_domain_id'), table_name='memory') op.drop_index('ix_memory_domain_status_kind', table_name='memory') op.drop_index(op.f('ix_memory_character_id'), table_name='memory') op.drop_table('memory') op.drop_index(op.f('ix_big_cycle_character_id'), table_name='big_cycle') op.drop_table('big_cycle') # ### end Alembic commands ###