Files
MemoryBear/api/migrations/versions/94a98e279951_202512121400.py
2025-12-15 13:54:31 +08:00

133 lines
4.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""202512121400
Revision ID: 94a98e279951
Revises: 20a742ef1d93
Create Date: 2025-12-12 14:09:25.256171
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from sqlalchemy import inspect
# revision identifiers, used by Alembic.
revision: str = '94a98e279951'
down_revision: Union[str, None] = '20a742ef1d93'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def table_exists(table_name: str) -> bool:
"""检查表是否存在"""
bind = op.get_bind()
inspector = inspect(bind)
return table_name in inspector.get_table_names()
def column_exists(table_name: str, column_name: str) -> bool:
"""检查列是否存在"""
bind = op.get_bind()
inspector = inspect(bind)
if not table_exists(table_name):
return False
columns = [col['name'] for col in inspector.get_columns(table_name)]
return column_name in columns
def index_exists(table_name: str, index_name: str) -> bool:
"""检查索引是否存在"""
bind = op.get_bind()
inspector = inspect(bind)
if not table_exists(table_name):
return False
indexes = [idx['name'] for idx in inspector.get_indexes(table_name)]
return index_name in indexes
def constraint_exists(table_name: str, constraint_name: str) -> bool:
"""检查约束是否存在(外键、唯一约束等)"""
bind = op.get_bind()
inspector = inspect(bind)
if not table_exists(table_name):
return False
# 检查外键约束
foreign_keys = [fk['name'] for fk in inspector.get_foreign_keys(table_name) if fk['name']]
if constraint_name in foreign_keys:
return True
# 检查唯一约束
unique_constraints = [uc['name'] for uc in inspector.get_unique_constraints(table_name) if uc['name']]
if constraint_name in unique_constraints:
return True
# 检查检查约束
check_constraints = [cc['name'] for cc in inspector.get_check_constraints(table_name) if cc['name']]
if constraint_name in check_constraints:
return True
return False
def trigger_exists(trigger_name: str) -> bool:
"""检查触发器是否存在PostgreSQL"""
bind = op.get_bind()
result = bind.execute(sa.text(
"SELECT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = :trigger_name)"
), {"trigger_name": trigger_name})
return result.scalar()
def sequence_exists(sequence_name: str) -> bool:
"""检查序列是否存在PostgreSQL"""
bind = op.get_bind()
result = bind.execute(sa.text(
"SELECT EXISTS (SELECT 1 FROM pg_class WHERE relkind = 'S' AND relname = :sequence_name)"
), {"sequence_name": sequence_name})
return result.scalar()
def enum_exists(enum_name: str) -> bool:
"""检查枚举类型是否存在PostgreSQL"""
bind = op.get_bind()
result = bind.execute(sa.text(
"SELECT EXISTS (SELECT 1 FROM pg_type WHERE typname = :enum_name)"
), {"enum_name": enum_name})
return result.scalar()
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('api_key_logs', schema=None) as batch_op:
batch_op.create_index(batch_op.f('ix_api_key_logs_endpoint'), ['endpoint'], unique=False)
batch_op.create_index(batch_op.f('ix_api_key_logs_status_code'), ['status_code'], unique=False)
with op.batch_alter_table('api_keys', schema=None) as batch_op:
batch_op.add_column(sa.Column('daily_request_limit', sa.Integer(), nullable=True, comment='日请求限制'))
batch_op.alter_column('rate_limit',
existing_type=sa.INTEGER(),
comment='QPS限制请求/秒)',
existing_comment='速率限制(请求/分钟)',
existing_nullable=True)
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('api_keys', schema=None) as batch_op:
batch_op.alter_column('rate_limit',
existing_type=sa.INTEGER(),
comment='速率限制(请求/分钟)',
existing_comment='QPS限制请求/秒)',
existing_nullable=True)
batch_op.drop_column('daily_request_limit')
with op.batch_alter_table('api_key_logs', schema=None) as batch_op:
batch_op.drop_index(batch_op.f('ix_api_key_logs_status_code'))
batch_op.drop_index(batch_op.f('ix_api_key_logs_endpoint'))
# ### end Alembic commands ###