Как я могу переписать этот цикл запросов Django как более эффективный запрос SQL? - PullRequest
1 голос
/ 10 марта 2010

Это неэффективный способ обновления денормализованного поля в модели Player Django. Поле по существу хранит позицию игрока в таблице лидеров, что является обязательным требованием для системы, которую мы используем для отображения «соседних» игроков для данного игрока.

for position, player in enumerate(Player.objects.order_by('-score')):
    player.position = position + 1
    player.save()

Есть ли способ выполнить это обновление в одном SQL-запросе? Используемая нами база данных базы данных - MySQL.

Спасибо за ваше время!

1 Ответ

1 голос
/ 10 марта 2010

Если вы думаете о SQL, стоящем за Player.objects.order_by('-score'), это SELECT player.* from player order by player.score desc. Я не уверен, что то, что вы хотите сделать, возможно без вложенного запроса MySQL, который технически в любом случае был бы двумя запросами.

Если вы вернетесь к исходному решению, оно действительно не будет таким сложным.

Если вас интересует производительность, я предлагаю вам проверить django-debug-toolbar, если вы еще этого не сделали. Этот небольшой пакет предоставляет время и статистику по запросам. Последняя версия (0.8.3) также предоставляет плагин CLI, который показывает вам запросы, выполненные с использованием manage.py shell (называемый debugsqlshell).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...