From c6b9582978faecb9ffc3b11532d0d42cdc220380 Mon Sep 17 00:00:00 2001 From: fawney19 Date: Mon, 15 Dec 2025 20:47:30 +0800 Subject: [PATCH] refactor(migration): merge index creation into main aliases migration --- ...f0cbf_remove_model_mappings_add_aliases.py | 52 +++++++++++++- ..._add_indexes_for_model_alias_resolution.py | 69 ------------------- 2 files changed, 49 insertions(+), 72 deletions(-) delete mode 100644 alembic/versions/20251215_0950_6d0a5273f0f1_add_indexes_for_model_alias_resolution.py diff --git a/alembic/versions/20251214_1300_e9b3d63f0cbf_remove_model_mappings_add_aliases.py b/alembic/versions/20251214_1300_e9b3d63f0cbf_remove_model_mappings_add_aliases.py index f0bba1c..0d721f0 100644 --- a/alembic/versions/20251214_1300_e9b3d63f0cbf_remove_model_mappings_add_aliases.py +++ b/alembic/versions/20251214_1300_e9b3d63f0cbf_remove_model_mappings_add_aliases.py @@ -4,6 +4,7 @@ 1. 添加 provider_model_aliases 字段到 models 表 2. 迁移 model_mappings 数据到 provider_model_aliases 3. 删除 model_mappings 表 +4. 添加索引优化别名解析性能 Revision ID: e9b3d63f0cbf Revises: 20251210_baseline @@ -175,10 +176,55 @@ def upgrade() -> None: # 3. 删除 model_mappings 表 op.drop_table('model_mappings') + # 4. 添加索引优化别名解析性能 + # provider_model_name 索引(支持精确匹配) + op.create_index( + "idx_model_provider_model_name", + "models", + ["provider_model_name"], + unique=False, + postgresql_where=sa.text("is_active = true"), + ) + + # provider_model_aliases GIN 索引(支持 JSONB 查询,仅 PostgreSQL) + if bind.dialect.name == "postgresql": + # 将 json 列转为 jsonb(jsonb 性能更好且支持 GIN 索引) + op.execute( + """ + ALTER TABLE models + ALTER COLUMN provider_model_aliases TYPE jsonb + USING provider_model_aliases::jsonb + """ + ) + # 创建 GIN 索引 + op.execute( + """ + CREATE INDEX IF NOT EXISTS idx_model_provider_model_aliases_gin + ON models USING gin(provider_model_aliases jsonb_path_ops) + WHERE is_active = true + """ + ) + def downgrade() -> None: - """恢复 model_mappings 表,移除 provider_model_aliases 字段""" - # 1. 恢复 model_mappings 表 + """恢复 model_mappings 表,移除 provider_model_aliases 字段和索引""" + bind = op.get_bind() + + # 1. 删除索引 + op.drop_index("idx_model_provider_model_name", table_name="models") + + if bind.dialect.name == "postgresql": + op.execute("DROP INDEX IF EXISTS idx_model_provider_model_aliases_gin") + # 将 jsonb 列还原为 json + op.execute( + """ + ALTER TABLE models + ALTER COLUMN provider_model_aliases TYPE json + USING provider_model_aliases::json + """ + ) + + # 2. 恢复 model_mappings 表 op.create_table( 'model_mappings', sa.Column('id', sa.String(36), primary_key=True), @@ -201,5 +247,5 @@ def downgrade() -> None: op.create_index('ix_model_mappings_provider_id', 'model_mappings', ['provider_id']) op.create_index('ix_model_mappings_mapping_type', 'model_mappings', ['mapping_type']) - # 2. 移除 provider_model_aliases 字段 + # 3. 移除 provider_model_aliases 字段 op.drop_column('models', 'provider_model_aliases') diff --git a/alembic/versions/20251215_0950_6d0a5273f0f1_add_indexes_for_model_alias_resolution.py b/alembic/versions/20251215_0950_6d0a5273f0f1_add_indexes_for_model_alias_resolution.py deleted file mode 100644 index 2c27085..0000000 --- a/alembic/versions/20251215_0950_6d0a5273f0f1_add_indexes_for_model_alias_resolution.py +++ /dev/null @@ -1,69 +0,0 @@ -"""add_indexes_for_model_alias_resolution - -Revision ID: 6d0a5273f0f1 -Revises: e9b3d63f0cbf -Create Date: 2025-12-15 09:50:23.423477+00:00 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = '6d0a5273f0f1' -down_revision = 'e9b3d63f0cbf' -branch_labels = None -depends_on = None - - -def upgrade() -> None: - """应用迁移:升级到新版本""" - # 为 models 表添加索引,优化别名解析性能 - - # 1. provider_model_name 索引(支持精确匹配) - op.create_index( - "idx_model_provider_model_name", - "models", - ["provider_model_name"], - unique=False, - postgresql_where=sa.text("is_active = true"), - ) - - # 2. provider_model_aliases GIN 索引(支持 JSONB 查询,仅 PostgreSQL) - # GIN 索引可以加速 @> 操作符的查询 - bind = op.get_bind() - if bind.dialect.name == "postgresql": - # 先将 json 列转为 jsonb(jsonb 性能更好且支持 GIN 索引) - op.execute( - """ - ALTER TABLE models - ALTER COLUMN provider_model_aliases TYPE jsonb - USING provider_model_aliases::jsonb - """ - ) - # 创建 GIN 索引 - op.execute( - """ - CREATE INDEX IF NOT EXISTS idx_model_provider_model_aliases_gin - ON models USING gin(provider_model_aliases jsonb_path_ops) - WHERE is_active = true - """ - ) - - -def downgrade() -> None: - """回滚迁移:降级到旧版本""" - # 删除索引 - op.drop_index("idx_model_provider_model_name", table_name="models") - - bind = op.get_bind() - if bind.dialect.name == "postgresql": - op.execute("DROP INDEX IF EXISTS idx_model_provider_model_aliases_gin") - # 将 jsonb 列还原为 json - op.execute( - """ - ALTER TABLE models - ALTER COLUMN provider_model_aliases TYPE json - USING provider_model_aliases::json - """ - )