Почему я получаю эту синтаксическую ошибку sql из запроса Django? - PullRequest
1 голос
/ 15 июля 2011

В Django у меня есть следующие запросы в представлении

applicant=Applicants.objects.get(ben=entity_number)
f471s=applicant.form471_set.order_by("-funding_year","number")
enrollment=f471s.values("schooldata__ben").annotate(f=Max("number")).filter(
           number=F("f")).values().aggregate(
           s=Sum("schooldata__student_count"))['s']

Когда я пытаюсь получить доступ к странице для этого представления, я получаю сообщение об ошибке

DatabaseError
(1064, "You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax to use 
near 'FROM (SELECT `frontend_form471`.`number` AS `number`,
`frontend_form471`.`form_s' at line 1")

Я заставил регистратор распечатать SQL, который генерирует Django, и получил

(0.001) SELECT  FROM (SELECT `frontend_form471`.`number` AS `number`,
`frontend_form471`.`form_status` AS `form_status`, `frontend_form471`.`ben_id`
AS `ben_id`, `frontend_form471`.`funding_year` AS `funding_year`,
MAX(`frontend_form471`.`number`) AS `f` FROM `frontend_form471` LEFT OUTER JOIN
`SchoolData` ON (`frontend_form471`.`number` = `SchoolData`.`f471 Application Number`)
WHERE (`frontend_form471`.`ben_id` = 122871 ) GROUP BY `frontend_form471`.`number`,
`frontend_form471`.`number`, `frontend_form471`.`form_status`,
`frontend_form471`.`ben_id`, `frontend_form471`.`funding_year` HAVING
`frontend_form471`.`number` =  MAX(`frontend_form471`.`number`) ORDER BY
`frontend_form471`.`funding_year` DESC, `frontend_form471`.`number` ASC) 
subquery; args=(u'122871',)

Для справки, я использую MySQL 5.1.54-1ubuntu4. Похоже, синтаксическая ошибка находится в первой строке, но я не понимаю, почему Django генерирует код SQL с неправильным синтаксисом. Можно ли как-то изменить что-либо (возможно, настройку), чтобы это исправить?

Редактировать: в ответ на ответ я также попытался запустить третью строку кода Python без второго вызова .values() и получил точно такой же эффект.

Ответы [ 3 ]

0 голосов
/ 15 июля 2011

В итоге я избежал этой проблемы, заменив третью строку кода Python на:

latest=SchoolData.objects.filter(f471__ben=entity_number).values(
       'ben').annotate(m=Max('f471__number')).order_by().distinct()
enrollment=sum(SchoolData.objects.filter(ben=l['ben']).get(
           f471__number=l['m']).student_count for l in latest)

Это сработало, но было очень медленно. В итоге некоторая дополнительная информация о моих данных позволила мне оптимизировать это так:

latestYear=f471s.aggregate(m=Max('funding_year'))['m']
enrollment=SchoolData.objects.filter(f471__ben=entity_number,
           f471__funding_year=latestYear).distinct().aggregate(
           s=Sum('student_count'))['s']

, который не делает то же самое, но решил мою проблему лучше.

0 голосов
/ 20 мая 2013

Если другие люди задаются вопросом, как и я, это допустимая ошибка Django: https://code.djangoproject.com/ticket/15624

0 голосов
/ 15 июля 2011

Проблема заключается во втором пустом предложении values ​​() после аннотации. Вы буквально говорите django не включать какие-либо столбцы в выборку.

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