[Modify] reset migration script

This commit is contained in:
Mark
2025-12-15 13:54:31 +08:00
parent 2b2b8902ac
commit d2a630addb
28 changed files with 4974 additions and 1836 deletions

View File

@@ -0,0 +1,132 @@
"""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 ###