fix: убрать блокирующие sync-вызовы БД из async-роутов миграций

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 <noreply@anthropic.com>
This commit is contained in:
jze9
2026-07-16 11:54:16 +05:00
parent fd098f917c
commit 6bda64ccbc

View File

@@ -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}.