From 763745a223741d97e64ff96003982e885c464096 Mon Sep 17 00:00:00 2001 From: NotBigGhost Date: Wed, 9 Sep 2026 20:00:49 +0300 Subject: [PATCH] =?UTF-8?q?Dev-=D0=BB=D0=B0=D1=83=D0=BD=D1=87=D0=B5=D1=80:?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D0=BD=D1=8F=D1=82=D1=8C=20?= =?UTF-8?q?=D0=BC=D0=B8=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=20=D1=81=D1=82=D0=B0=D1=80=D1=82=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ветка задачи может принести миграцию, а run.ps1/run.sh сразу запускали uvicorn: приложение поднималось на старой схеме и падало 500 на первом обращении к новой таблице. Так вышло с 0012_match_finish_draft — создание партии отвечало «no such table: match_finish_drafts». В test/prod такого нет, там схему накатывает entrypoint.sh контейнера. Отдельно разобран случай «база новее ветки»: после возврата с ветки задачи alembic не находит ревизию, которой в этой ветке ещё нет. Останавливать запуск тут не за что — лишние таблицы старому коду не мешают, поэтому печатаем предупреждение и идём дальше. Настоящая ошибка миграции по-прежнему останавливает запуск. stderr alembic в run.ps1 уводится в файл: в Windows PowerShell 5.1 «2>&1» на нативном exe заворачивает каждую строку в ErrorRecord, а решение принимается по коду возврата. run.ps1 остался строго ASCII. #36 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01BoiJK9ux8peeyjLb8TYjFf --- run.ps1 | 24 ++++++++++++++++++++++++ run.sh | 17 +++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/run.ps1 b/run.ps1 index 9bf026c..f3158ac 100644 --- a/run.ps1 +++ b/run.ps1 @@ -82,6 +82,30 @@ switch ($appEnv) { Write-Host "node_modules not found. First: cd frontend; npm install" -ForegroundColor Red exit 1 } + # Schema first: a branch may add a migration, and uvicorn would otherwise start + # on the old schema and fail with 500 on the first hit of a new table. + # stderr goes to a file: alembic logs there, and in PowerShell 5.1 "2>&1" on a + # native exe wraps every line into an ErrorRecord. + Write-Host "Applying migrations (alembic upgrade head)..." -ForegroundColor Green + $migLog = [System.IO.Path]::GetTempFileName() + Push-Location $backend + & $py -m alembic upgrade head 2> $migLog + $migCode = $LASTEXITCODE + Pop-Location + $migText = (Get-Content $migLog -Raw) + Remove-Item $migLog -Force -ErrorAction SilentlyContinue + if ($migCode -ne 0) { + Write-Host $migText + if ($migText -match "locate revision") { + # The DB carries a migration this branch does not have (switched back from + # a feature branch). Extra tables do not bother the older code - go on. + Write-Host "DB is newer than this branch - migrations skipped." -ForegroundColor Yellow + } else { + Write-Host "Migrations failed - not starting. Fix the error above and retry." -ForegroundColor Red + exit 1 + } + } + Write-Host "Starting backend (uvicorn --reload) and frontend (vite) in separate windows..." -ForegroundColor Green Start-Process powershell -ArgumentList @( "-NoExit", "-Command", diff --git a/run.sh b/run.sh index ad90724..047d691 100644 --- a/run.sh +++ b/run.sh @@ -50,6 +50,23 @@ case "$app_env" in [ -x "$py" ] || py="$root/backend/.venv/Scripts/python.exe" # Git Bash на Windows [ -x "$py" ] || { echo "Нет venv. Сначала: cd backend && python -m venv .venv && pip install -e '.[dev]'"; exit 1; } [ -d "$root/frontend/node_modules" ] || { echo "Нет node_modules. Сначала: cd frontend && npm install"; exit 1; } + # Сначала схема: ветка могла принести миграцию, и без неё бэк поднимется на + # старой схеме и упадёт 500 на первом же обращении к новой таблице. + echo "Применяю миграции (alembic upgrade head)…" + mig_log="$( cd "$root/backend" && "$py" -m alembic upgrade head 2>&1 )" && mig_code=0 || mig_code=$? + if [ "$mig_code" -ne 0 ]; then + echo "$mig_log" + case "$mig_log" in + *"locate revision"*) + # В базе миграция, которой нет в этой ветке (вернулись с ветки задачи). + # Лишние таблицы старому коду не мешают — продолжаем запуск. + echo "База новее ветки — миграции пропущены." ;; + *) + echo "Миграции не применились — не запускаю. Исправьте ошибку выше и повторите." + exit 1 ;; + esac + fi + echo "Запуск бэка (uvicorn --reload) и фронта (vite)… Ctrl+C — остановить всё." ( cd "$root/backend" && exec "$py" -m uvicorn app.main:app --reload ) & back=$! -- 2.54.0