На новом проекте пришлось изобретать велосипед.
Причина весьма серьезная - часть обращений к базе данных делается напрямую, большая часть через весьма специфический внешний объектный интерфейс, поддерживающий sql-подобные запросы. Возвращающий объекты, разумеется (мы все равно вынуждены преобразовывать их в наши доменные объекты). И позволяющий много чего еще. Например, он слушает специфические сервисы и может сказать о том, что данные устарели (при этом обновляя локальный cache).
sqlaclhemy напрямую использовать нельзя.
За две недели написал свою ORM. Из алхимии безбожно драл идею (session, query, mapper&table definition, query language from sql package). Unit of work взят с минимальными изменениями. topologic sort - без изменений.
В результате - есть sessions, уверенные тразакции, простой в описании mapping объектов на внутренне предсталение, ленивая загрузка, foreingn relations, one-to-many relations with back references, язык построения запросов для query.filter, query.order_by и прочего. (Я забыл упомянуть что-то важное???)
Наследование доменных объектов (как в алхимии) - очень важное требование. Поддерживается аналог polimorphic_on для описаня mapper.
Результат - таки работает.
Выводы:
не очень-то сложно написать “с нуля” ORM. Если знаешь, что нужно сделать.
sqlalchemy - отличная штука. Даже простое заимствование архитектуры мне сильно облегчило жизнь.
Почему пишу:
не бойтесь “изобретать велосипед”, если это действительно необходимо (изучите все аналоги перед таким серьезным шагом).
написание такой непростой вещи, как ORM, на деле заняло не очень много времени (конечно же, я имел превосходный пример для подражания)
Может кому-нибудь будет интересно….