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:
@@ -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}.
|
||||
|
||||
Reference in New Issue
Block a user