#32418: Django f expressions seems to not work with MySQL
-------------------------------+--------------------------------------
     Reporter:  HoshiYamazaki  |                    Owner:  nobody
         Type:  Bug            |                   Status:  new
    Component:  Uncategorized  |                  Version:  3.1
     Severity:  Normal         |               Resolution:
     Keywords:                 |             Triage Stage:  Unreviewed
    Has patch:  0              |      Needs documentation:  0
  Needs tests:  0              |  Patch needs improvement:  0
Easy pickings:  0              |                    UI/UX:  0
-------------------------------+--------------------------------------
Description changed by HoshiYamazaki:

Old description:

> My code:
> ```python
> duration_expression = ExpressionWrapper(
>     datetime.timedelta(minutes=1) * F('duration'),
>     output_field=DurationField())
> booking_end = ExpressionWrapper(
>     F('booking_dt') + duration_expression,
>     output_field=DateTimeField())
> booking_qs.annotate(
>     booking_end=booking_end).get(
>     Q(Q(booking_dt__lte=first_interval),
>       Q(booking_dt__gte=next_interval)) |
>     Q(Q(booking_end__lte=first_interval),
>       Q(booking_end__gte=next_interval)))duration_expression =
> ExpressionWrapper(
>     datetime.timedelta(minutes=1) * F('duration'),
>     output_field=DurationField())
> booking_end = ExpressionWrapper(
>     F('booking_dt') + duration_expression,
>     output_field=DateTimeField())
> booking_qs.annotate(
>     booking_end=booking_end).get(
>     Q(Q(booking_dt__lte=first_interval),
>       Q(booking_dt__gte=next_interval)) |
>     Q(Q(booking_end__lte=first_interval),
>       Q(booking_end__gte=next_interval)))
> ```
>
> Error I get:
> ```
> (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
> '* `carwashes_carwashbooking`.`duration`) MICROSECOND) AS `booking_end`
> FROM `car' at line 1")
> ```
>
> SQL query:
> ```sql
> ('SELECT `carwashes_carwashbooking`.`id`, '
>  '`carwashes_carwashbooking`.`carwash_id`, '
>  '`carwashes_carwashbooking`.`created_dt`, '
>  '`carwashes_carwashbooking`.`booking_dt`, '
>  '`carwashes_carwashbooking`.`duration`,
> `carwashes_carwashbooking`.`car_id`, '
>  '`carwashes_carwashbooking`.`car_name`,
> `carwashes_carwashbooking`.`plate`, '
>  '`carwashes_carwashbooking`.`status`,
> `carwashes_carwashbooking`.`driver_id`, '
>  '`carwashes_carwashbooking`.`phone_number`, '
>  '`carwashes_carwashbooking`.`service_id`,
> `carwashes_carwashbooking`.`notes`, '
>  '(`carwashes_carwashbooking`.`booking_dt` + INTERVAL (INTERVAL 60000000
> '
>  'MICROSECOND * `carwashes_carwashbooking`.`duration`) MICROSECOND) AS '
>  '`booking_end` FROM `carwashes_carwashbooking` WHERE '
>  '(`carwashes_carwashbooking`.`carwash_id` = %s AND '
>  '`carwashes_carwashbooking`.`driver_id` = %s AND '
>  '((`carwashes_carwashbooking`.`booking_dt` <= %s AND '
>  '`carwashes_carwashbooking`.`booking_dt` >= %s) OR '
>  '((`carwashes_carwashbooking`.`booking_dt` + INTERVAL (INTERVAL 60000000
> '
>  'MICROSECOND * `carwashes_carwashbooking`.`duration`) MICROSECOND) <= %s
> AND '
>  '(`carwashes_carwashbooking`.`booking_dt` + INTERVAL (INTERVAL 60000000
> '
>  'MICROSECOND * `carwashes_carwashbooking`.`duration`) MICROSECOND) >=
> %s))) '
>  'LIMIT 21')
> ```
>
> Stackoverflow issue: https://stackoverflow.com/questions/66044255/django-
> returns-sql-syntax-error-when-using-expressionwrapper-and-f-expressions

New description:

 My code:


 {{{
 duration_expression = ExpressionWrapper(
     datetime.timedelta(minutes=1) * F('duration'),
     output_field=DurationField())
 booking_end = ExpressionWrapper(
     F('booking_dt') + duration_expression,
     output_field=DateTimeField())
 booking_qs.annotate(
     booking_end=booking_end).get(
     Q(Q(booking_dt__lte=first_interval),
       Q(booking_dt__gte=next_interval)) |
     Q(Q(booking_end__lte=first_interval),
       Q(booking_end__gte=next_interval)))duration_expression =
 ExpressionWrapper(
     datetime.timedelta(minutes=1) * F('duration'),
     output_field=DurationField())
 booking_end = ExpressionWrapper(
     F('booking_dt') + duration_expression,
     output_field=DateTimeField())
 booking_qs.annotate(
     booking_end=booking_end).get(
     Q(Q(booking_dt__lte=first_interval),
       Q(booking_dt__gte=next_interval)) |
     Q(Q(booking_end__lte=first_interval),
       Q(booking_end__gte=next_interval)))
 }}}



 Error I get:


 {{{
 (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
 '* `carwashes_carwashbooking`.`duration`) MICROSECOND) AS `booking_end`
 FROM `car' at line 1")
 }}}


 SQL query:


 {{{
 ('SELECT `carwashes_carwashbooking`.`id`, '
  '`carwashes_carwashbooking`.`carwash_id`, '
  '`carwashes_carwashbooking`.`created_dt`, '
  '`carwashes_carwashbooking`.`booking_dt`, '
  '`carwashes_carwashbooking`.`duration`,
 `carwashes_carwashbooking`.`car_id`, '
  '`carwashes_carwashbooking`.`car_name`,
 `carwashes_carwashbooking`.`plate`, '
  '`carwashes_carwashbooking`.`status`,
 `carwashes_carwashbooking`.`driver_id`, '
  '`carwashes_carwashbooking`.`phone_number`, '
  '`carwashes_carwashbooking`.`service_id`,
 `carwashes_carwashbooking`.`notes`, '
  '(`carwashes_carwashbooking`.`booking_dt` + INTERVAL (INTERVAL 60000000 '
  'MICROSECOND * `carwashes_carwashbooking`.`duration`) MICROSECOND) AS '
  '`booking_end` FROM `carwashes_carwashbooking` WHERE '
  '(`carwashes_carwashbooking`.`carwash_id` = %s AND '
  '`carwashes_carwashbooking`.`driver_id` = %s AND '
  '((`carwashes_carwashbooking`.`booking_dt` <= %s AND '
  '`carwashes_carwashbooking`.`booking_dt` >= %s) OR '
  '((`carwashes_carwashbooking`.`booking_dt` + INTERVAL (INTERVAL 60000000
 '
  'MICROSECOND * `carwashes_carwashbooking`.`duration`) MICROSECOND) <= %s
 AND '
  '(`carwashes_carwashbooking`.`booking_dt` + INTERVAL (INTERVAL 60000000 '
  'MICROSECOND * `carwashes_carwashbooking`.`duration`) MICROSECOND) >=
 %s))) '
  'LIMIT 21')
 }}}



 Stackoverflow issue: https://stackoverflow.com/questions/66044255/django-
 returns-sql-syntax-error-when-using-expressionwrapper-and-f-expressions

--

-- 
Ticket URL: <https://code.djangoproject.com/ticket/32418#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/071.38e78559240f41f9a44e6452a71f4b29%40djangoproject.com.

Reply via email to