2015-08-04 4 views
0

У меня есть SQL JOIN, не переводить хорошо в синтаксис Django ORM и мне интересно, какие альтернативные решения лучше:Джанго JOIN: необработанный SQL vs. в памяти

  1. Использование сырой запрос SQL, или
  2. Используйте два запроса и выполните объединение в памяти, чтобы аннотировать один из них.

Я могу присоединиться к двум запросам в линейном времени, поэтому я не думаю, что 2. будет значительно медленнее. Но какой из подходов лучше концептуально?

+0

2. Звучит очень похоже на [prefetch_related] (https://docs.djangoproject.com/en/1.8/ref/models/querysets/#prefetch-related). Что именно ты пытаешься сделать? –

+0

Проблема заключается в том, что JOIN не выполняется по внешнему ключу. Поле - это дата, и я хочу вернуть, сколько других записей имеет эту дату. Это связанный с этим вопрос, который я опубликовал до того, как http://stackoverflow.com/questions/31798858/join-two-queries-in-django-orm –

+0

Приведен конкретный пример. См. Мой ответ по связанному с вами вопросу. –

ответ

2

Основными соображениями являются производительность, читаемость/четкость кода и ремонтопригодность.

Если производительность здесь не проблема, как вы говорите, то ясность и ремонтопригодность являются основными факторами. Чистый код Python/Django, как правило, более ясен, чтобы читать и следовать своей цели, чем встраивать SQL-запросы в виде строк в коде Python. По моему опыту, SQL-запросы как строки также сложнее поддерживать, так как они не будут вызывать синтаксические ошибки, если ваша модель изменится и запрос больше недействителен. Вместо этого проблема будет обнаружена во время выполнения.

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