From 6bda64ccbc753b5c6f4ddadc5818e8aa4a2ac818 Mon Sep 17 00:00:00 2001 From: jze9 Date: Thu, 16 Jul 2026 11:54:16 +0500 Subject: [PATCH] =?UTF-8?q?fix:=20=D1=83=D0=B1=D1=80=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?=D0=B1=D0=BB=D0=BE=D0=BA=D0=B8=D1=80=D1=83=D1=8E=D1=89=D0=B8?= =?UTF-8?q?=D0=B5=20sync-=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2=D1=8B=20=D0=91?= =?UTF-8?q?=D0=94=20=D0=B8=D0=B7=20async-=D1=80=D0=BE=D1=83=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=BC=D0=B8=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit route/init_data_base.py объявлял create_tables/migrate_cascade_user/ migrate_users/migrate_tables/clear_tables как async def, но внутри дёргал синхронный SQLAlchemy engine напрямую в event loop — блокировал весь однопроцессный uvicorn на время миграции. Остальные ~92 роута в проекте корректно используют обычный def (FastAPI сам уносит их в threadpool). Привёл эти пять к тому же паттерну. Co-Authored-By: Claude Sonnet 5 --- route/init_data_base.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/route/init_data_base.py b/route/init_data_base.py index a76dc77..9066fef 100644 --- a/route/init_data_base.py +++ b/route/init_data_base.py @@ -43,7 +43,7 @@ def collect_metadatas(): @router.post("/db/create-tables", dependencies=[Depends(require_admin_key)]) -async def create_tables(): +def create_tables(): """Создаёт все таблицы, описанные в модулях `db.tables`. Endpoint вызывается по нажатию кнопки в UI (POST). @@ -71,7 +71,7 @@ async def create_tables(): @router.post("/db/migrate-cascade-user", dependencies=[Depends(require_admin_key)]) -async def migrate_cascade_user(): +def migrate_cascade_user(): """Добавляет FK responses.user_id → users.id ON DELETE CASCADE, если ещё не существует.""" engine = get_engine() try: @@ -95,7 +95,7 @@ async def migrate_cascade_user(): @router.post("/db/migrate-users", dependencies=[Depends(require_admin_key)]) -async def migrate_users(): +def migrate_users(): """Добавляет колонки username и hashed_password в таблицу users, если они ещё не существуют.""" engine = get_engine() try: @@ -116,7 +116,7 @@ class ClearDBIn(BaseModel): @router.post("/db/migrate", dependencies=[Depends(require_admin_key)]) -async def migrate_tables(): +def migrate_tables(): """Приводит схему БД в соответствие с моделями: убирает устаревшие колонки, добавляет новые.""" engine = get_engine() migrations = [ @@ -142,7 +142,7 @@ async def migrate_tables(): @router.post("/db/clear", dependencies=[Depends(require_admin_key)]) -async def clear_tables(payload: ClearDBIn): +def clear_tables(payload: ClearDBIn): """Полная очистка всех таблиц, описанных в `bd.tables`. Требуется явное подтверждение: POST с телом {"confirm": true}.