Схема БД конфигурируемая: DB_SCHEMA (#38) #53

Merged
aep merged 1 commits from feat/38-db-schema-setting into main 2026-10-07 18:33:45 +03:00
Owner

Closes #38

Что сделано

  • Settings.DB_SCHEMA (по умолчанию dkb; валидация [a-z_][a-z0-9_]{0,62}, не pg_*). В контуре — OPENBAO__APP__DB_SCHEMA.
  • models/base.py (SCHEMA = settings.DB_SCHEMA: MetaData, enum, sequence), db/db.py (search_path), alembic/env.py, scripts/seed.py, tests/conftest.py читают её. Миграции 0001-0005 не держат своей константы: from src.models.base import SCHEMA, строковые FK — f"{SCHEMA}.x.id".
  • Тесты: валидация настройки (в т.ч. SQL-инъекция в имени), tests/test_db_schema.py — upgrade head / запрос через сессию приложения / downgrade base в схеме dkb_alt (схема dkb не создаётся, все FK и 28 enum в dkb_alt).
  • api/.env.example, api/.env.test, README (таблица переменных), CLAUDE.md.

Сравнение офлайн-SQL

alembic -x dburl=... upgrade head --sql (ENV_FILE=.env.test) до правки (origin/main) и после, значение по умолчанию: cmp — идентичны, 45235 байт, sha256 7ad2d14440e5198488059b30044ffb2cc55cf9dc330abaed83c697d9175fb592 у обоих. С DB_SCHEMA=dkb_alt в выводе 286 строк с dkb_alt и ни одной с dkb.

make check-full

Зелёный (код 0): 1261 passed (unit), 818 passed (integration), ruff/mypy/dbml-check/docker/web.

Rulings I made

  • R-1: схема читается из настроек при импорте models/base.py (а не schema_translate_map). Настройки уже нужны alembic (URL БД) и всем процессам, .env.test подхватывается pytest-env; schema_translate_map не покрывает сырой SQL и строковые FK миграций и требует настройки в каждой точке создания движка. Цена: любой процесс, импортирующий модели, должен иметь env настроек (раньше нужен был и так: src/__init__ тянет приложение).
  • R-2: миграции берут схему из src.models.base.SCHEMA, а не из op.get_context() — SCHEMA нужна на уровне модуля (хелпер enum, FK-строки в теле), контекст доступен только внутри upgrade().
  • R-3: DB_SCHEMA в .env.test фиксирован dkb; тест нестандартной схемы запускает alembic и «приложение» подпроцессами с DB_SCHEMA=dkb_alt в окружении (SCHEMA читается при импорте, в процессе pytest меняться не может). run_alembic/alembic_async получили параметр env.
  • R-4: scripts/check_dbml_vs_orm.py принудительно ставит DB_SCHEMA=dkb в окружении процесса: сверка с DBML идёт в эталонной схеме, имя схемы на неё не влияет; dbml_parity.py остаётся без импорта src.
  • R-5: остальные тесты (tests/test_*, "dkb." в SQL тестов) оставлены с литералом dkb — они работают в схеме по умолчанию; параметризовать их — вне задачи.

Наблюдения

  • O-1: смена DB_SCHEMA у уже мигрированной БД не переносит таблицы — задокументировано в README (одно значение для приложения и миграций). deferred (нужна ли миграция «переименования схемы» — решение владельца).

🤖 Generated with Claude Code

https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3

Closes #38 ## Что сделано - `Settings.DB_SCHEMA` (по умолчанию `dkb`; валидация `[a-z_][a-z0-9_]{0,62}`, не `pg_*`). В контуре — `OPENBAO__APP__DB_SCHEMA`. - `models/base.py` (`SCHEMA` = `settings.DB_SCHEMA`: MetaData, enum, sequence), `db/db.py` (`search_path`), `alembic/env.py`, `scripts/seed.py`, `tests/conftest.py` читают её. Миграции 0001-0005 не держат своей константы: `from src.models.base import SCHEMA`, строковые FK — `f"{SCHEMA}.x.id"`. - Тесты: валидация настройки (в т.ч. SQL-инъекция в имени), `tests/test_db_schema.py` — `upgrade head` / запрос через сессию приложения / `downgrade base` в схеме `dkb_alt` (схема `dkb` не создаётся, все FK и 28 enum в `dkb_alt`). - `api/.env.example`, `api/.env.test`, README (таблица переменных), CLAUDE.md. ## Сравнение офлайн-SQL `alembic -x dburl=... upgrade head --sql` (ENV_FILE=.env.test) до правки (origin/main) и после, значение по умолчанию: `cmp` — идентичны, 45235 байт, sha256 `7ad2d14440e5198488059b30044ffb2cc55cf9dc330abaed83c697d9175fb592` у обоих. С `DB_SCHEMA=dkb_alt` в выводе 286 строк с `dkb_alt` и ни одной с `dkb`. ## make check-full Зелёный (код 0): 1261 passed (unit), 818 passed (integration), ruff/mypy/dbml-check/docker/web. ## Rulings I made - R-1: схема читается из настроек при импорте `models/base.py` (а не `schema_translate_map`). Настройки уже нужны alembic (URL БД) и всем процессам, `.env.test` подхватывается pytest-env; `schema_translate_map` не покрывает сырой SQL и строковые FK миграций и требует настройки в каждой точке создания движка. Цена: любой процесс, импортирующий модели, должен иметь env настроек (раньше нужен был и так: `src/__init__` тянет приложение). - R-2: миграции берут схему из `src.models.base.SCHEMA`, а не из `op.get_context()` — `SCHEMA` нужна на уровне модуля (хелпер `enum`, FK-строки в теле), контекст доступен только внутри `upgrade()`. - R-3: `DB_SCHEMA` в `.env.test` фиксирован `dkb`; тест нестандартной схемы запускает alembic и «приложение» подпроцессами с `DB_SCHEMA=dkb_alt` в окружении (`SCHEMA` читается при импорте, в процессе pytest меняться не может). `run_alembic`/`alembic_async` получили параметр `env`. - R-4: `scripts/check_dbml_vs_orm.py` принудительно ставит `DB_SCHEMA=dkb` в окружении процесса: сверка с DBML идёт в эталонной схеме, имя схемы на неё не влияет; `dbml_parity.py` остаётся без импорта `src`. - R-5: остальные тесты (`tests/test_*`, `"dkb."` в SQL тестов) оставлены с литералом `dkb` — они работают в схеме по умолчанию; параметризовать их — вне задачи. ## Наблюдения - O-1: смена `DB_SCHEMA` у уже мигрированной БД не переносит таблицы — задокументировано в README (одно значение для приложения и миграций). deferred (нужна ли миграция «переименования схемы» — решение владельца). 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
aep added 1 commit 2026-10-07 18:26:57 +03:00
DB_SCHEMA (по умолчанию dkb, валидация идентификатора) читают models/base.py (SCHEMA), db/db.py (search_path),
alembic/env.py и миграции 0001-0005 (SCHEMA и строковые FK f"{SCHEMA}.x.id" вместо литералов). В контуре -
OPENBAO__APP__DB_SCHEMA. Офлайн-SQL `alembic upgrade head --sql` при значении по умолчанию совпадает побайтно.
Тесты: валидация настройки, миграции и сессия приложения в схеме dkb_alt; .env.example/.env.test/README/CLAUDE.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
aep merged commit 99669cd081 into main 2026-10-07 18:33:45 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/arm-core#53
No description provided.