Skip to content

Instantly share code, notes, and snippets.

@airstrike
Created April 16, 2020 01:25
Show Gist options
  • Save airstrike/e6ac4feb96136b71dda5e3fcfa32418e to your computer and use it in GitHub Desktop.
Save airstrike/e6ac4feb96136b71dda5e3fcfa32418e to your computer and use it in GitHub Desktop.
Traceback for subquery-join error upon evaluating the same Subquery twice in a row
C:\projects\fundraiser fundraiser λ python manage.py shell
Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 22:39:24) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from fundraising.models import *
>>> from django.db.models.sql.constants import LOUTER
>>> from django.db.models import *
>>> donations = Donation.objects.values('week').annotate(agg=Sum('amount')).filter(membership__group__id=OuterRef('membership__group_id'))
>>> groups = Group.objects.annotate(amounts=Subquery(donations, join=True, join_type=LOUTER))
>>> groups
DEBUG django.db.backends utils.py@123 (0.000)
SELECT "fundraising_group"."id",
"fundraising_group"."name"
FROM "fundraising_group"
LEFT OUTER JOIN "fundraising_membership" ON ("fundraising_group"."id" = "fundraising_membership"."group_id")
LEFT OUTER JOIN
(SELECT "fundraising_donation"."week",
SUM("fundraising_donation"."amount") AS "agg",
"fundraising_membership"."group_id" AS "__col1"
FROM "fundraising_donation"
INNER JOIN "fundraising_membership" ON ("fundraising_donation"."membership_id" = "fundraising_membership"."id")
GROUP BY "fundraising_donation"."week",
"fundraising_membership"."group_id") "amounts" ON "amounts"."__col1" = "fundraising_membership"."group_id"
LIMIT 21;
args=()
<QuerySet [<Group: Group object (1)>, <Group: Group object (1)>, <Group: Group object (1)>, <Group: Group object (1)>, <Group: Group object (1)>, <Group: Group object (1)>, <Group: Group object (1)>, <Group: Group object (1)>, <Group: Group object (2)>, <Group: Group object (2)>, <Group: Group object (2)>, <Group: Group object (2)>, <Group: Group object (2)>, <Group: Group object (2)>, <Group: Group object (2)>, <Group: Group object (2)>]>
>>> groups
DEBUG django.db.backends utils.py@123 (0.000)
SELECT "fundraising_group"."id",
"fundraising_group"."name"
FROM "fundraising_group"
LEFT OUTER JOIN "fundraising_membership" ON ("fundraising_group"."id" = "fundraising_membership"."group_id")
LEFT OUTER JOIN
(SELECT "fundraising_donation"."week",
SUM("fundraising_donation"."amount") AS "agg",
"fundraising_membership"."group_id" AS "__col1"
FROM "fundraising_donation"
INNER JOIN "fundraising_membership" ON ("fundraising_donation"."membership_id" = "fundraising_membership"."id")
GROUP BY "fundraising_donation"."week",
"fundraising_membership"."group_id") "amounts" ON "amounts"."__col1" = "fundraising_membership"."group_id"
LIMIT 21;
args=()
<QuerySet [<Group: Group object (1)>, <Group: Group object (1)>, <Group: Group object (1)>, <Group: Group object (1)>, <Group: Group object (1)>, <Group: Group object (1)>, <Group: Group object (1)>, <Group: Group object (1)>, <Group: Group object (2)>, <Group: Group object (2)>, <Group: Group object (2)>, <Group: Group object (2)>, <Group: Group object (2)>, <Group: Group object (2)>, <Group: Group object (2)>, <Group: Group object (2)>]>
>>> Group.objects.annotate(amounts=Subquery(donations, join=True, join_type=LOUTER))
DEBUG django.db.backends utils.py@123 (0.000)
SELECT "fundraising_group"."id",
"fundraising_group"."name"
FROM "fundraising_group"
LEFT OUTER JOIN
(SELECT "fundraising_donation"."week",
SUM("fundraising_donation"."amount") AS "agg",
"amounts"."__col1" AS "__col1"
FROM "fundraising_donation"
INNER JOIN "fundraising_membership" ON ("fundraising_donation"."membership_id" = "fundraising_membership"."id")
GROUP BY "fundraising_donation"."week",
"amounts"."__col1") "amounts" ON "amounts"."__col1" = "fundraising_membership"."group_id"
LIMIT 21;
args=()
Traceback (most recent call last):
File "C:\virtual\fundraiser\lib\site-packages\django-3.1.dev20200415194915-py3.8.egg\django\db\backends\utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "C:\virtual\fundraiser\lib\site-packages\django-3.1.dev20200415194915-py3.8.egg\django\db\backends\sqlite3\base.py", line 411, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: no such column: amounts.__col1
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\virtual\fundraiser\lib\site-packages\django-3.1.dev20200415194915-py3.8.egg\django\db\models\query.py", line 262, in __repr__
data = list(self[:REPR_OUTPUT_SIZE + 1])
File "C:\virtual\fundraiser\lib\site-packages\django-3.1.dev20200415194915-py3.8.egg\django\db\models\query.py", line 268, in __len__
self._fetch_all()
File "C:\virtual\fundraiser\lib\site-packages\django-3.1.dev20200415194915-py3.8.egg\django\db\models\query.py", line 1296, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "C:\virtual\fundraiser\lib\site-packages\django-3.1.dev20200415194915-py3.8.egg\django\db\models\query.py", line 53, in __iter__
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
File "C:\virtual\fundraiser\lib\site-packages\django-3.1.dev20200415194915-py3.8.egg\django\db\models\sql\compiler.py", line 1140, in execute_sql
cursor.execute(sql, params)
File "C:\virtual\fundraiser\lib\site-packages\django-3.1.dev20200415194915-py3.8.egg\django\db\backends\utils.py", line 98, in execute
return super().execute(sql, params)
File "C:\virtual\fundraiser\lib\site-packages\django-3.1.dev20200415194915-py3.8.egg\django\db\backends\utils.py", line 66, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "C:\virtual\fundraiser\lib\site-packages\django-3.1.dev20200415194915-py3.8.egg\django\db\backends\utils.py", line 75, in _execute_with_wrappers
return executor(sql, params, many, context)
File "C:\virtual\fundraiser\lib\site-packages\django-3.1.dev20200415194915-py3.8.egg\django\db\backends\utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "C:\virtual\fundraiser\lib\site-packages\django-3.1.dev20200415194915-py3.8.egg\django\db\utils.py", line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "C:\virtual\fundraiser\lib\site-packages\django-3.1.dev20200415194915-py3.8.egg\django\db\backends\utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "C:\virtual\fundraiser\lib\site-packages\django-3.1.dev20200415194915-py3.8.egg\django\db\backends\sqlite3\base.py", line 411, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such column: amounts.__col1
>>>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment