Opened 3 years ago

Last modified 3 years ago

#33435 closed Cleanup/optimization

Since django 3.0 Subquery.as_sql() generates invalid SQL — at Version 1

Reported by: M1ha Shvn Owned by: nobody
Component: Database layer (models, ORM) Version: dev
Severity: Normal Keywords: subquery, as_sql
Cc: Simon Charette Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: yes UI/UX: no

Description (last modified by M1ha Shvn)

Since this commit Subquery.as_sql(...) method returns incorrect SQL removing first and last symbols instead of absent breakets. Adding Subquery().query.subquery = True attribute fixes the problem. From my point of view, it should be set in Subquery constructor.

from django.db import connection
from apps.models import App

q = Subquery(App.objects.all())

print(str(q.query))

# Output SQL is valid:
#  'SELECT "apps_app"."id", "apps_app"."name" FROM "apps_app"'

print(q.as_sql(q.query.get_compiler('default'), connection))

# Outptut SQL is invalid (no S letter at the beggining and " symbol at the end):
# ('(ELECT "apps_app"."id", "apps_app"."name" FROM "apps_app)', ())

q.query.subquery = True
print(q.as_sql(q.query.get_compiler('default'), connection))

# Outputs correct result
('(SELECT "apps_app"."id", "apps_app"."name" FROM "apps_app")', ())

Change History (1)

comment:1 by M1ha Shvn, 3 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top