v1.4.1: Alembic — client_encoding=utf8 для psycopg3

Устраняет TypeError при определении версии PostgreSQL (bytes vs str).

Made-with: Cursor
This commit is contained in:
Alexandr
2026-04-03 08:50:11 +03:00
parent 349cea85a3
commit 124457deaa
5 changed files with 19 additions and 5 deletions

View File

@ -2,6 +2,12 @@
Формат: семантическое версионирование `MAJOR.MINOR.PATCH`. Git-теги `v1.0.0`, `v1.1.0` и т.д. — см. [docs/VERSIONING.md](docs/VERSIONING.md). Формат: семантическое версионирование `MAJOR.MINOR.PATCH`. Git-теги `v1.0.0`, `v1.1.0` и т.д. — см. [docs/VERSIONING.md](docs/VERSIONING.md).
## [1.4.1] — 2026-04-03
### Исправлено
- **Alembic:** к URL с `postgresql+psycopg` добавляется `client_encoding=utf8`, чтобы `alembic upgrade head` не падал с `TypeError: ... bytes-like object` при некоторых настройках кодировки на стороне PostgreSQL/psycopg3.
## [1.4.0] — 2026-04-03 ## [1.4.0] — 2026-04-03
Правое меню «Разделы» на главной и на страницах модулей, пункты из `MODULE_MOUNTS` (`title` + `ui_router`). Правое меню «Разделы» на главной и на страницах модулей, пункты из `MODULE_MOUNTS` (`title` + `ui_router`).

View File

@ -1,6 +1,6 @@
# onGuard24 # onGuard24
**Версия: 1.4.0** · Модульный монолит на **Python (FastAPI)**: ядро, приём алертов из Grafana, заготовки модулей (дежурства, контакты, светофор), PostgreSQL, проверки Vault / Grafana / Forgejo. **Версия: 1.4.1** · Модульный монолит на **Python (FastAPI)**: ядро, приём алертов из Grafana, заготовки модулей (дежурства, контакты, светофор), PostgreSQL, проверки Vault / Grafana / Forgejo.
| Документ | Назначение | | Документ | Назначение |
|----------|------------| |----------|------------|
@ -82,7 +82,7 @@ Vite проксирует `/api` на `http://127.0.0.1:8080` (см. `web/vite.c
## Миграции БД (Alembic) ## Миграции БД (Alembic)
- URL БД: переменная **`DATABASE_URL`** (как у приложения; в `alembic/env.py` используется синхронный драйвер `postgresql+psycopg`). - URL БД: переменная **`DATABASE_URL`** (как у приложения; в `alembic/env.py` используется синхронный драйвер `postgresql+psycopg`). К URL автоматически добавляется **`client_encoding=utf8`**, чтобы миграции не падали с `TypeError: ... bytes-like object`, если на сервере PostgreSQL включён режим вроде `SQL_ASCII`.
- Применить схему: `alembic upgrade head`. - Применить схему: `alembic upgrade head`.
- Новая ревизия: `alembic revision -m "описание"` и правка файла в `alembic/versions/`. - Новая ревизия: `alembic revision -m "описание"` и правка файла в `alembic/versions/`.

View File

@ -20,6 +20,14 @@ if config.config_file_name is not None:
target_metadata = None target_metadata = None
def _ensure_psycopg_client_encoding(url: str) -> str:
"""Иначе psycopg3 при SQL_ASCII на сервере отдаёт version() как bytes → падает SQLAlchemy re.match."""
if "+psycopg" not in url or "client_encoding=" in url:
return url
join = "&" if "?" in url else "?"
return f"{url}{join}client_encoding=utf8"
def get_sync_url() -> str: def get_sync_url() -> str:
url = os.environ.get("DATABASE_URL", "").strip() url = os.environ.get("DATABASE_URL", "").strip()
if not url: if not url:
@ -30,7 +38,7 @@ def get_sync_url() -> str:
url = url.replace("postgresql://", "postgresql+psycopg://", 1) url = url.replace("postgresql://", "postgresql+psycopg://", 1)
if "+asyncpg" in url: if "+asyncpg" in url:
url = url.replace("+asyncpg", "+psycopg") url = url.replace("+asyncpg", "+psycopg")
return url return _ensure_psycopg_client_encoding(url)
def run_migrations_offline() -> None: def run_migrations_offline() -> None:

View File

@ -1,3 +1,3 @@
"""onGuard24 — модульный монолит (ядро + модули).""" """onGuard24 — модульный монолит (ядро + модули)."""
__version__ = "1.4.0" __version__ = "1.4.1"

View File

@ -1,6 +1,6 @@
[project] [project]
name = "onguard24" name = "onguard24"
version = "1.4.0" version = "1.4.1"
description = "onGuard24 — модульный сервис (аналог IRM)" description = "onGuard24 — модульный сервис (аналог IRM)"
readme = "README.md" readme = "README.md"
requires-python = ">=3.11" requires-python = ">=3.11"