
Что в SQLAlchemy лучше чем в Django ORM? Это главный вопрос, который я слышу от Django guys1, и у меня есть на него ответ — SQLAlchemy может выразить любой SQL запрос (ну 80-90%), в отличие от Django ORM, в котором можно выразить только весьма простые вещи.
И в некоторых Django проектах возникает необходимость в сложных запросах, на которые стандартный ORM неспособен. Условно предположим, что в момент создания проекта считалось, что Django ORM вполне хватит. Для решения можно писать чистый SQL или воспользоваться SQLAlchemy. Я за второй подход, так как чистый SQL плохо поддается DRY-фикации.
Какие недостатки при использовании SQLAlchemy? Нужно описать структуру данных для этой библиотеки отдельно, так как SQLAlchemy и Django ORM не совместимы, да и не было такого плана у их создателей. Также вы можете попробовать построить модель данных по структуре из БД. Тоже вариант, но всплывают тонкие моменты, когда собственно БД еще нет. Я пошел по другому пути и построил структуру по джанго моделям в своем проекте Aldjemy.
Для использования вам просто нужно добавить `aldjemy` в конец INSTALLED_APPS, и aldjemy пройдется по всем моделям и добавит к ним аттрибут `sa`.
Попробуем, запускайте ./manage.py shell_plus и введите:
User.sa.query.join(User.sa.user_groups).join(User.sa.user_groups.property.mapper.class_.group).filter(Group.sa.name=="GROUP_NAME")
Стоп, нужно указывать все join-ы явно? Конечно, это же SQLA, и в SQLA запросы строятся с явным указанием всех join-ов и прочего. Но на самом деле, надо ли использовать SQLA для выборки пользователей в группе? Конечно нет! SQLA придет на помощь в тот момент, когда вы будете писать сложный запрос, направленный на оптимизацию, на ускорение генерации страницы — и здесь возможность написать именно тот запрос, который вам хотелось, будет благословением.
Проект на github.
Или на PyPi:
pip install aldjemy
1. Django guys это такие ребята, которые упорно не желают видеть недостатков Django. Более того — да они даже не в курсе про множество библиотек за пределами этого узкого Dj-мирка.
Из документации: But aldjemy is not positioned as Django ORM drop-in replacement. Its helper for special situations.
Пример кода, который вы так просите habrahabr.ru/blogs/python/128052/#comment_4231276