簡體   English   中英

Django 錯誤“django.db.utils.ProgrammingError: subquery has too many columns”

[英]Django Error “django.db.utils.ProgrammingError: subquery has too many columns ”

原始查詢本身是正確的,我能夠從數據庫中檢索原始查詢集。 我需要將其轉換為查詢集以進行進一步處理,並且我面臨以下錯誤。

創建相應的 django 查詢對我來說很難,這就是為什么我創建 SQL 查詢,獲取原始查詢集,現在嘗試將其轉換為查詢集以進行進一步處理。

為了匿名,我更改了 django model 名稱和表名。

這是我在 django shell 中嘗試的 output。 我能夠執行下面的查詢,但是當我嘗試訪問下面的“queryset”時收到錯誤“django.db.utils.ProgrammingError: subquery has too many columns”。

from django.db.models.expressions import RawSQL
from xyz.models import *
value = '1.2.3.4'
queryset = Test1.objects.filter(id__in=RawSQL("SELECT DISTINCT ON (test1.start_time, test1.id) test1.id, test1.name, test1.start_time FROM test1 WHERE EXISTS (SELECT * FROM test2 JOIN test3 ON test2.test3_id = test3.id AND test3.value = %s JOIN test4 ON test2.test4_id = test4.id AND test4.test1_id = test1.id) ORDER BY test1.start_time DESC", params=[value]))

為了便於閱讀,我已經格式化了下面使用的查詢。

SELECT
  DISTINCT ON (test1.start_time, test1.id)
  test1.id,
  test1.name,
  test1.start_time
FROM
  test1
WHERE
  EXISTS (
    SELECT
      *
    FROM
      test2
      JOIN test3 ON test2.test3_id = test3.id
      AND test3.value = 'value'
      JOIN test4 ON test2.test4_id = test4.id
      AND test4.test1_id = test1.id
  )
ORDER BY
  test1.start_time DESC

如錯誤所示,您選擇的列太多,您的過濾條件不需要。 在過濾id字段時,您的子查詢必須 select 僅Test1id字段。 所以基本上你的子查詢應該只像這樣投影id字段:

SELECT
  test1.id
FROM
  test1
WHERE
  EXISTS (
    SELECT
      *
    FROM
      test2
      JOIN test3 ON test2.test3_id = test3.id
      AND test3.value = 'value'
      JOIN test4 ON test2.test4_id = test4.id
      AND test4.test1_id = test1.id
  )
ORDER BY
  test1.start_time DESC

所以你的最終查詢集應該是這樣的:

queryset = Test1.objects.filter(id__in=RawSQL("SELECT test1.id FROM test1 WHERE EXISTS (SELECT * FROM test2 JOIN test3 ON test2.test3_id = test3.id AND test3.value = %s JOIN test4 ON test2.test4_id = test4.id AND test4.test1_id = test1.id) ORDER BY test1.start_time DESC", params=[value]))

你根本不需要 RawSQL

from django.db.models import Exists, OuterRef

queryset = Test1.objects.filter(
    Exists(Test2.objects.filter(
        test3__value=value,
        test4__test1_id=OuterRef('id')
    )
)

我不確定您的 django model 名稱,因此test3test4test1在您的示例中可能會有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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