From 07877450985f6ca497fd0739c1cf2582d89f423f Mon Sep 17 00:00:00 2001 From: Alexandr Date: Fri, 3 Apr 2026 08:50:11 +0300 Subject: [PATCH] =?UTF-8?q?v1.4.1:=20Alembic=20=E2=80=94=20client=5Fencodi?= =?UTF-8?q?ng=3Dutf8=20=D0=B4=D0=BB=D1=8F=20psycopg3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Устраняет TypeError при определении версии PostgreSQL (bytes vs str). Made-with: Cursor --- CHANGELOG.md | 6 ++++++ README.md | 4 ++-- alembic/env.py | 10 +++++++++- onguard24/__init__.py | 2 +- pyproject.toml | 2 +- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 905afb5..a775671 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ Формат: семантическое версионирование `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 Правое меню «Разделы» на главной и на страницах модулей, пункты из `MODULE_MOUNTS` (`title` + `ui_router`). diff --git a/README.md b/README.md index 6c94532..22b885d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 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) -- 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 revision -m "описание"` и правка файла в `alembic/versions/`. diff --git a/alembic/env.py b/alembic/env.py index 990ae2b..fdc477a 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -20,6 +20,14 @@ if config.config_file_name is not 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: url = os.environ.get("DATABASE_URL", "").strip() if not url: @@ -30,7 +38,7 @@ def get_sync_url() -> str: url = url.replace("postgresql://", "postgresql+psycopg://", 1) if "+asyncpg" in url: url = url.replace("+asyncpg", "+psycopg") - return url + return _ensure_psycopg_client_encoding(url) def run_migrations_offline() -> None: diff --git a/onguard24/__init__.py b/onguard24/__init__.py index 37bf145..054d478 100644 --- a/onguard24/__init__.py +++ b/onguard24/__init__.py @@ -1,3 +1,3 @@ """onGuard24 — модульный монолит (ядро + модули).""" -__version__ = "1.4.0" +__version__ = "1.4.1" diff --git a/pyproject.toml b/pyproject.toml index b7d063d..da18f87 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "onguard24" -version = "1.4.0" +version = "1.4.1" description = "onGuard24 — модульный сервис (аналог IRM)" readme = "README.md" requires-python = ">=3.11"