Добавить модель БД
Postgres-first, но переносимо: тесты гоняют те же модели против aiosqlite. Схема слоёв и правила — в Архитектуре.
Шаги
Модель. Новый файл
src/infrastructure/database/models/<name>.py— модель-на-файл, никаких «всё в models.py». НаследуйтеBase(+IntPk,TimestampMixinпри нужде) изsrc/infrastructure/database/base.py:- деньги →
BigInt, суффикс_minor(целые minor-units, ADR-0002); - даты →
AwareDateTime(UTC-aware). Никаких наивныхdatetime; - JSON/массивы →
JsonB(JSONB на Postgres, JSON на sqlite). UUID →Uuid(); - enum-колонки →
Enum(MyEnum, native_enum=False, length=N)— переносимо, без PG-enum-типов; - partial-unique индексы →
Index(..., postgresql_where=text(...), sqlite_where=text(...)).
- деньги →
Регистрация. Добавьте импорт и запись в
__all__вsrc/infrastructure/database/models/__init__.py— иначе миграция иcreate_allне увидят таблицу.DAO. Тонкий
class <Name>DAO(BaseDAO[<Model>])вsrc/infrastructure/database/dao/(или вcatalog.pyдля справочников). Доменные запросы — сюда же при необходимости.UnitOfWork. Заведите атрибут в
src/infrastructure/database/uow.py:self.<name>s = <Name>DAO(session).Миграция. При живом Postgres:
bashmake revision m="add <name>" # автоген # глазами проверить диф миграции! make migrateAutogenerate против Postgres корректнее рукописной миграции — JSONB и partial-index он выводит правильно.
Тест/фабрика. При необходимости — helper в
tests/factories.pyи тест на новый флоу.
Проверка
make checkДержите модель переносимой
Тесты создают схему через Base.metadata.create_all на aiosqlite. Кастомный тип без sqlite-варианта или PG-специфичная конструкция без sqlite_where-парного условия — и тесты отвалятся. Все нужные переносимые типы уже есть в base.py.
