[英]Why am I getting this sql syntax error from a Django query?
在 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")
我讓記錄器打印出 Django 正在生成的 SQL,我得到了
(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 代碼。 有什么辦法可以改變一些東西(可能是一個設置)來解決這個問題?
編輯:作為對答案的回應,我還嘗試在沒有第二個.values()
調用的情況下運行 python 代碼的第三行並得到完全相同的效果。
如果其他人像我一樣想知道,這是一個公認的 Django 錯誤: https://code.djangoproject.com/ticket/15624
我最終通過將第三行 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']
這並不完全相同,但更好地解決了我的特定問題。
問題是注釋后的第二個空 values() 子句。 您實際上是在告訴 django 不要在 select 中包含任何列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.