簡體   English   中英

為什么我從 Django 查詢中收到此 sql 語法錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM