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)])
|
@router.post("/db/create-tables", dependencies=[Depends(require_admin_key)])
|
||||||
async def create_tables():
|
def create_tables():
|
||||||
"""Создаёт все таблицы, описанные в модулях `db.tables`.
|
"""Создаёт все таблицы, описанные в модулях `db.tables`.
|
||||||
|
|
||||||
Endpoint вызывается по нажатию кнопки в UI (POST).
|
Endpoint вызывается по нажатию кнопки в UI (POST).
|
||||||
@@ -71,7 +71,7 @@ async def create_tables():
|
|||||||
|
|
||||||
|
|
||||||
@router.post("/db/migrate-cascade-user", dependencies=[Depends(require_admin_key)])
|
@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, если ещё не существует."""
|
"""Добавляет FK responses.user_id → users.id ON DELETE CASCADE, если ещё не существует."""
|
||||||
engine = get_engine()
|
engine = get_engine()
|
||||||
try:
|
try:
|
||||||
@@ -95,7 +95,7 @@ async def migrate_cascade_user():
|
|||||||
|
|
||||||
|
|
||||||
@router.post("/db/migrate-users", dependencies=[Depends(require_admin_key)])
|
@router.post("/db/migrate-users", dependencies=[Depends(require_admin_key)])
|
||||||
async def migrate_users():
|
def migrate_users():
|
||||||
"""Добавляет колонки username и hashed_password в таблицу users, если они ещё не существуют."""
|
"""Добавляет колонки username и hashed_password в таблицу users, если они ещё не существуют."""
|
||||||
engine = get_engine()
|
engine = get_engine()
|
||||||
try:
|
try:
|
||||||
@@ -116,7 +116,7 @@ class ClearDBIn(BaseModel):
|
|||||||
|
|
||||||
|
|
||||||
@router.post("/db/migrate", dependencies=[Depends(require_admin_key)])
|
@router.post("/db/migrate", dependencies=[Depends(require_admin_key)])
|
||||||
async def migrate_tables():
|
def migrate_tables():
|
||||||
"""Приводит схему БД в соответствие с моделями: убирает устаревшие колонки, добавляет новые."""
|
"""Приводит схему БД в соответствие с моделями: убирает устаревшие колонки, добавляет новые."""
|
||||||
engine = get_engine()
|
engine = get_engine()
|
||||||
migrations = [
|
migrations = [
|
||||||
@@ -142,7 +142,7 @@ async def migrate_tables():
|
|||||||
|
|
||||||
|
|
||||||
@router.post("/db/clear", dependencies=[Depends(require_admin_key)])
|
@router.post("/db/clear", dependencies=[Depends(require_admin_key)])
|
||||||
async def clear_tables(payload: ClearDBIn):
|
def clear_tables(payload: ClearDBIn):
|
||||||
"""Полная очистка всех таблиц, описанных в `bd.tables`.
|
"""Полная очистка всех таблиц, описанных в `bd.tables`.
|
||||||
|
|
||||||
Требуется явное подтверждение: POST с телом {"confirm": true}.
|
Требуется явное подтверждение: POST с телом {"confirm": true}.
|
||||||
|
|||||||
Reference in New Issue
Block a user