![](/img/trans.png)
[英]Django Postgres django.db.utils.ProgrammingError
[英]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 僅Test1
表id
字段。 所以基本上你的子查詢應該只像這樣投影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 名稱,因此test3
、 test4
和test1
在您的示例中可能會有所不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.