Просмотр SQL запросов в Django: часть2

Сегодня наконец-то собрался с силами и оформил тэг для просмотра sql запросов в виде отдельного приложения. Для просмотра EXPLAIN запросов требуется настройка url dispatcher и отдельный view, так что получилось полноценное приложение.
 

Просмотр SQL запросов, сделанных Django ORM

Частая задача, которая встаёт при использовании Django в серьёзных проектах - знать, какие именно запросы генерирует Django ORM. Неподготовленного человека просмотр этих SQL запросов (вернее их количества) может привести в шок ) Например, если поле объекта является ForeignKey(null=True), то при выводе этого поля у множества объектов, на каждый объект будет делаться запрос для этого поля и даже select_related() не поможет.

Подобные проблемы решаются различными ухищрениями типа:
- http://web-brains.com/2007/12/06/selecte_related_and_foreign_key/
- http://piranha.org.ua/blog/2007/10/31/related-objects/

Но рассказать я хочу не про ухищрения, о которых и так уже рассказано, а о том, как можно удобно просматривать SQL запросы для каждой конкретной страницы сайта, сделанного на Django.
 

Утечка памяти в Django ORM

Предыстория. Напарсил полмиллиона записей и решил их скриптом (на базе моделей и ORM django) обработать. Но вот незадача - на 143 тысяче скрипт умирал от нехватки памяти.

Стал я, значит, думать, кто виноват и что делать. Конечно, легче всего было свалить всё на django ORM. что я и сделал ) Найдя виноватого, я с чистой совестью пошёл читать всяческие документации и дискуссии в django developers на тему мемори ликов. Выяснил две вещи:
- я неправильно понимал работу django ORM
- memory leaks в django orm отсутствуют
 

select_related() and ForeignKey(null=True)

Есть такая штука в django - selecte_related. Если вы присовокупите её к какому-нить QuerySet, то она сделает вот что: начнёт сказать по полям ForeignKey объектов из QuerySet и подгружать объекты, если у тех есть ForeignKey, то у них тоже подгрузит что-нибудь и т.д. Глубину проникновения можно регулировать параметром depth. Но есть у этой штуки один недостаток: она не работает с ForeignKey, которые могут быть null.