Как стать автором
Обновить

SQLAlchemy для Django

Время на прочтение2 мин
Количество просмотров28K
Автор оригинала: Mikhail Krivushin
image Я не люблю Django. Я не люблю Django ORM, Django templates, Django forms и еще множество вещей в Django. Но у Django есть определенное преимущество — многие используют Django, практически любой python-программист знаком с джанго. Поэтому приходится мириться с недостатками этого фреймворка, но никто не мешает облегчать себе жизнь, используя действительно хорошие python библиотеки, например SQLAlchemy.

Что в 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
Теги:
Хабы:
+18
Комментарии303

Публикации

Изменить настройки темы

Истории

Работа

Data Scientist
60 вакансий
Python разработчик
132 вакансии

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн