#29777: ORA-00933: SQL command not properly ended with pagination in a 
ModelViewSet
-------------------------------------+-------------------------------------
     Reporter:  zorky                |                    Owner:  nobody
         Type:  Bug                  |                   Status:  closed
    Component:  Database layer       |                  Version:  2.1
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:  invalid
     Keywords:                       |             Triage Stage:
  orm,oracle,pagination              |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Description changed by zorky:

Old description:

> After an upgrade from Django 2.0.6 to Django 2.1.1 and DRF 3.8.2, I got
> an error with a ModelViewSet with '''pagination''', it worked with
> previous version.
>
> When I get rid off pagination, there is no problems.
>
> The stack error, notice the end :
>
> {{{
>   api-dev         | The above exception was the direct cause of the
> following exception:
> api-dev         |
> api-dev         | Traceback (most recent call last):
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/django/core/handlers/exception.py", line 34, in inner
> api-dev         |     response = get_response(request)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/django/core/handlers/base.py", line 126, in _get_response
> api-dev         |     response = self.process_exception_by_middleware(e,
> request)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/django/core/handlers/base.py", line 124, in _get_response
> api-dev         |     response = wrapped_callback(request,
> *callback_args, **callback_kwargs)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/django/views/decorators/csrf.py", line 54, in wrapped_view
> api-dev         |     return view_func(*args, **kwargs)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/rest_framework/viewsets.py", line 103, in view
> api-dev         |     return self.dispatch(request, *args, **kwargs)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/rest_framework/views.py", line 483, in dispatch
> api-dev         |     response = self.handle_exception(exc)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/rest_framework/views.py", line 443, in handle_exception
> api-dev         |     self.raise_uncaught_exception(exc)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/rest_framework/views.py", line 480, in dispatch
> api-dev         |     response = handler(request, *args, **kwargs)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/rest_framework/mixins.py", line 42, in list
> api-dev         |     page = self.paginate_queryset(queryset)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/rest_framework/generics.py", line 173, in paginate_queryset
> api-dev         |     return self.paginator.paginate_queryset(queryset,
> self.request, view=self)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/rest_framework/pagination.py", line 337, in paginate_queryset
> api-dev         |     return list(queryset[self.offset:self.offset +
> self.limit])
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/django/db/models/query.py", line 268, in __iter__
> api-dev         |     self._fetch_all()
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/django/db/models/query.py", line 1186, in _fetch_all
> api-dev         |     self._result_cache =
> list(self._iterable_class(self))
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/django/db/models/query.py", line 54, in __iter__
> api-dev         |     results =
> compiler.execute_sql(chunked_fetch=self.chunked_fetch,
> chunk_size=self.chunk_size)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/django/db/models/sql/compiler.py", line 1065, in execute_sql
> api-dev         |     cursor.execute(sql, params)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/debug_toolbar/panels/sql/tracking.py", line 176, in execute
> api-dev         |     return self._record(self.cursor.execute, sql,
> params)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/debug_toolbar/panels/sql/tracking.py", line 117, in _record
> api-dev         |     return method(sql, params)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/django/db/backends/utils.py", line 100, in execute
> api-dev         |     return super().execute(sql, params)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/raven/contrib/django/client.py", line 127, in execute
> api-dev         |     return real_execute(self, sql, params)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/django/db/backends/utils.py", line 68, in execute
> api-dev         |     return self._execute_with_wrappers(sql, params,
> many=False, executor=self._execute)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/django/db/backends/utils.py", line 77, in _execute_with_wrappers
> api-dev         |     return executor(sql, params, many, context)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/django/db/backends/utils.py", line 85, in _execute
> api-dev         |     return self.cursor.execute(sql, params)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/django/db/utils.py", line 89, in __exit__
> api-dev         |     raise dj_exc_value.with_traceback(traceback) from
> exc_value
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/django/db/backends/utils.py", line 85, in _execute
> api-dev         |     return self.cursor.execute(sql, params)
> api-dev         |   File "/usr/local/lib/python3.6/site-
> packages/django/db/backends/oracle/base.py", line 513, in execute
> api-dev         |     return self.cursor.execute(query,
> self._param_generator(params))
> api-dev         | django.db.utils.DatabaseError: ORA-00933: SQL command
> not properly ended
> }}}
>
> Example of my ModelViewSet and Model
>
> {{{
> #!div style="font-size: 80%"
> Code highlighting:
>   {{{#!python
> class MelLoginViewSet(viewsets.ModelViewSet):
>     queryset = MelLoginAnglais.objects.all()
>     serializer_class = MelLoginAnglaisSimpleSerializer
>
>     filter_backends = (django_filters.rest_framework.DjangoFilterBackend,
> OrderingFilter, SearchFilter,)
>
>     pagination_class = LimitOffsetPagination
>     page_size = 10
>
> class MelLoginAnglais(models.Model):
>     cod_ind = models.IntegerField(primary_key=True)
>     nom_login = models.CharField(max_length=100)
>
>     def __str__(self):
>         return "MelLogin : {cod} {login}".format(
>             cod=self.cod_ind,
>             login=self.nom_login
>         )
>
>     class Meta:
>         db_table = '"APOGEE"."MEL_LOGIN"'
>         managed = False
>   }}}
> }}}
>
> with python 3.6, Oracle 11.0.2.4
>
> cx-Oracle 5.2.1 or 7.0

New description:

 After an upgrade from Django 2.0.6 to Django 2.1.1 and DRF 3.8.2, I got an
 error with a ModelViewSet with '''pagination''', it worked with previous
 version.

 When I get rid off pagination, there is no problems.

 The stack error, notice the end :

 {{{
   api-dev         | The above exception was the direct cause of the
 following exception:
 api-dev         |
 api-dev         | Traceback (most recent call last):
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/django/core/handlers/exception.py", line 34, in inner
 api-dev         |     response = get_response(request)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/django/core/handlers/base.py", line 126, in _get_response
 api-dev         |     response = self.process_exception_by_middleware(e,
 request)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/django/core/handlers/base.py", line 124, in _get_response
 api-dev         |     response = wrapped_callback(request, *callback_args,
 **callback_kwargs)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/django/views/decorators/csrf.py", line 54, in wrapped_view
 api-dev         |     return view_func(*args, **kwargs)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/rest_framework/viewsets.py", line 103, in view
 api-dev         |     return self.dispatch(request, *args, **kwargs)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/rest_framework/views.py", line 483, in dispatch
 api-dev         |     response = self.handle_exception(exc)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/rest_framework/views.py", line 443, in handle_exception
 api-dev         |     self.raise_uncaught_exception(exc)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/rest_framework/views.py", line 480, in dispatch
 api-dev         |     response = handler(request, *args, **kwargs)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/rest_framework/mixins.py", line 42, in list
 api-dev         |     page = self.paginate_queryset(queryset)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/rest_framework/generics.py", line 173, in paginate_queryset
 api-dev         |     return self.paginator.paginate_queryset(queryset,
 self.request, view=self)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/rest_framework/pagination.py", line 337, in paginate_queryset
 api-dev         |     return list(queryset[self.offset:self.offset +
 self.limit])
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/django/db/models/query.py", line 268, in __iter__
 api-dev         |     self._fetch_all()
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/django/db/models/query.py", line 1186, in _fetch_all
 api-dev         |     self._result_cache =
 list(self._iterable_class(self))
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/django/db/models/query.py", line 54, in __iter__
 api-dev         |     results =
 compiler.execute_sql(chunked_fetch=self.chunked_fetch,
 chunk_size=self.chunk_size)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/django/db/models/sql/compiler.py", line 1065, in execute_sql
 api-dev         |     cursor.execute(sql, params)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/debug_toolbar/panels/sql/tracking.py", line 176, in execute
 api-dev         |     return self._record(self.cursor.execute, sql,
 params)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/debug_toolbar/panels/sql/tracking.py", line 117, in _record
 api-dev         |     return method(sql, params)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/django/db/backends/utils.py", line 100, in execute
 api-dev         |     return super().execute(sql, params)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/raven/contrib/django/client.py", line 127, in execute
 api-dev         |     return real_execute(self, sql, params)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/django/db/backends/utils.py", line 68, in execute
 api-dev         |     return self._execute_with_wrappers(sql, params,
 many=False, executor=self._execute)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/django/db/backends/utils.py", line 77, in _execute_with_wrappers
 api-dev         |     return executor(sql, params, many, context)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/django/db/backends/utils.py", line 85, in _execute
 api-dev         |     return self.cursor.execute(sql, params)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/django/db/utils.py", line 89, in __exit__
 api-dev         |     raise dj_exc_value.with_traceback(traceback) from
 exc_value
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/django/db/backends/utils.py", line 85, in _execute
 api-dev         |     return self.cursor.execute(sql, params)
 api-dev         |   File "/usr/local/lib/python3.6/site-
 packages/django/db/backends/oracle/base.py", line 513, in execute
 api-dev         |     return self.cursor.execute(query,
 self._param_generator(params))
 api-dev         | django.db.utils.DatabaseError: ORA-00933: SQL command
 not properly ended
 }}}

 Example of my ModelViewSet and Model

 {{{
 #!div style="font-size: 80%"
 Code highlighting:
   {{{#!python
 class MelLoginViewSet(viewsets.ModelViewSet):
     queryset = MelLoginAnglais.objects.all()
     serializer_class = MelLoginAnglaisSimpleSerializer

     filter_backends = (django_filters.rest_framework.DjangoFilterBackend,
 OrderingFilter, SearchFilter,)

     pagination_class = LimitOffsetPagination
     page_size = 10

 class MelLoginAnglais(models.Model):
     cod_ind = models.IntegerField(primary_key=True)
     nom_login = models.CharField(max_length=100)

     def __str__(self):
         return "MelLogin : {cod} {login}".format(
             cod=self.cod_ind,
             login=self.nom_login
         )

     class Meta:
         db_table = '"APOGEE"."MEL_LOGIN"'
         managed = False
   }}}
 }}}

 with python 3.6, Oracle 11.2.0.4

 cx-Oracle 5.2.1 or 7.0

--

-- 
Ticket URL: <https://code.djangoproject.com/ticket/29777#comment:5>
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 post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/063.31a24bd653fecaec39c1ddc55466858e%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to