From d73a443484edd38abe9d8321f55981c693e194d0 Mon Sep 17 00:00:00 2001 From: fawney19 Date: Wed, 24 Dec 2025 01:24:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=88=9D=E6=AC=A1?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=20migrate.sh=20=E6=97=B6=20usage=20=E8=A1=A8?= =?UTF-8?q?=E4=B8=8D=E5=AD=98=E5=9C=A8=E7=9A=84=E9=97=AE=E9=A2=98=20(#43)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 baseline 中直接创建 usage 表复合索引 - 在后续迁移中添加表存在性检查,避免 AUTOCOMMIT 连接看不到事务中的表 --- alembic/versions/20251210_baseline.py | 4 ++++ .../20251220_1500_add_usage_composite_indexes.py | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/alembic/versions/20251210_baseline.py b/alembic/versions/20251210_baseline.py index 78f2aa9..43eefb4 100644 --- a/alembic/versions/20251210_baseline.py +++ b/alembic/versions/20251210_baseline.py @@ -394,6 +394,10 @@ def upgrade() -> None: index=True, ), ) + # usage 表复合索引(优化常见查询) + op.create_index("idx_usage_user_created", "usage", ["user_id", "created_at"]) + op.create_index("idx_usage_apikey_created", "usage", ["api_key_id", "created_at"]) + op.create_index("idx_usage_provider_model_created", "usage", ["provider", "model", "created_at"]) # ==================== user_quotas ==================== op.create_table( diff --git a/alembic/versions/20251220_1500_add_usage_composite_indexes.py b/alembic/versions/20251220_1500_add_usage_composite_indexes.py index 024c817..01d519b 100644 --- a/alembic/versions/20251220_1500_add_usage_composite_indexes.py +++ b/alembic/versions/20251220_1500_add_usage_composite_indexes.py @@ -20,12 +20,28 @@ def upgrade() -> None: 使用 CONCURRENTLY 创建索引以避免锁表, 但需要在 AUTOCOMMIT 模式下执行(不能在事务内) + + 注意:如果是从全新数据库执行(baseline 刚创建表), + 由于 AUTOCOMMIT 连接看不到事务中未提交的表,会跳过索引创建。 + 这种情况下索引会在下次迁移或手动创建。 """ conn = op.get_bind() engine = conn.engine # 使用新连接并设置 AUTOCOMMIT 模式以支持 CREATE INDEX CONCURRENTLY with engine.connect().execution_options(isolation_level="AUTOCOMMIT") as autocommit_conn: + # 检查 usage 表是否存在(在 AUTOCOMMIT 连接中可见) + # 如果表不存在(例如 baseline 迁移还在事务中),跳过索引创建 + result = autocommit_conn.execute(text( + "SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'usage')" + )) + table_exists = result.scalar() + + if not table_exists: + # 表在当前连接不可见(可能 baseline 还在事务中),跳过 + # 索引将通过后续迁移或手动创建 + return + # 使用 IF NOT EXISTS 避免重复创建,无需单独检查索引是否存在 # 1. user_id + created_at 复合索引 (用户用量查询)