zestedesavoir / zds-site

Cœur du projet technique de Zeste de Savoir
https://zestedesavoir.com
Other
268 stars 161 forks source link

Impossible de charger la liste des exports avec SQLite 3.22.0 car cette version n'est plus supportée sans que ce ne soit précisé nulle part #5871

Closed Situphen closed 4 years ago

Situphen commented 4 years ago

Impossible de charger la liste des exports avec SQLite

Reproduction

Trace correspondante dans la console

ERROR:django.request:Internal Server Error: /api/contenus/exports/31/
Traceback (most recent call last):
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 383, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: near "(": syntax error
philippemilink commented 4 years ago

Je n'arrive pas à reproduire.

Situphen commented 4 years ago

Je viens de vérifier sur upstream/dev à jour après avoir bien mis à jour les paquets Python et Node JS et j'ai toujours le soucis. Que ce soit sur un tutoriel installé avec les données factices ou avec le tutoriel Arduino.

Caractéristiques techniques

Trace complète

ERROR:django.request:Internal Server Error: /api/contenus/exports/31/
Traceback (most recent call last):
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 383, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: near "(": syntax error

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/rest_framework/views.py", line 505, in dispatch
    response = self.handle_exception(exc)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/rest_framework/views.py", line 465, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/rest_framework/views.py", line 476, in raise_uncaught_exception
    raise exc
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/rest_framework/views.py", line 502, in dispatch
    response = handler(request, *args, **kwargs)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/rest_framework/generics.py", line 199, in get
    return self.list(request, *args, **kwargs)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/rest_framework/mixins.py", line 38, in list
    queryset = self.filter_queryset(self.get_queryset())
  File "/home/situphen/Code/zds-site/zds/tutorialv2/api/views.py", line 172, in get_queryset
    prefetch_related_objects(exports, 'published_object')
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/db/models/query.py", line 1546, in prefetch_related_objects
    if not model_instances:
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/db/models/query.py", line 1391, in __bool__
    self._fetch_all()
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/db/models/query.py", line 1382, in _fetch_all
    self._result_cache = list(self.iterator())
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/db/models/query.py", line 1405, in iterator
    query = iter(self.query)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/db/models/sql/query.py", line 102, in __iter__
    self._execute_query()
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/db/models/sql/query.py", line 136, in _execute_query
    self.cursor.execute(self.sql, params)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/debug_toolbar/panels/sql/tracking.py", line 198, in execute
    return self._record(self.cursor.execute, sql, params)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/debug_toolbar/panels/sql/tracking.py", line 133, in _record
    return method(sql, params)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/db/backends/utils.py", line 99, in execute
    return super().execute(sql, params)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/db/backends/utils.py", line 67, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/db/backends/utils.py", line 76, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/db/utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/home/situphen/Code/zds-site/zdsenv/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 383, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: near "(": syntax error
AmauryCarrade commented 4 years ago

SQLite 3.22.0

Les fonctions de fenêtrage (window functions), nécessaires pour la requête récupérant les derniers exports, ne sont disponibles que depuis SQLite 3.25.0 (septembre 2018). Ta version est trop vieille (janvier 2018).

Peut-être faudrait-il spécifier la version minimale de SQLite quelque part.

Situphen commented 4 years ago

Peut-être faudrait-il spécifier la version minimale de SQLite quelque part.

Oui ce serait bien en effet ! Étant donné que SQLite vient avec Python dans la majorité des cas, ça fait passer la version minimale de Python à 3.7.4. Enfin en soit ce n'est pas gênant de rester sur du Python 3.6 sauf ce petit soucis.

AmauryCarrade commented 4 years ago

Le site reste fonctionnel sauf pour ça, mais en effet il faudrait le documenter quelque part, histoire que ça ne surprenne pas trop ^^

firm1 commented 4 years ago

Il n'y aurait pas moyen d’exécuter cette requête autrement pour le cas ou on rentre dans le except avec un warning dans la console django qui dit qu'il vaudrait mieux update sa version de python si on veut avoir de meilleur perf ?

AmauryCarrade commented 4 years ago

Difficilement, ou alors il faudrait récupérer tous les enregistrements et faire le tri en Python

La question que je me pose c'est — est-ce pertinent pour un si petit apport (les gens en version de développement avec une vieille version de SQLite) ? Si la réponse est oui, je peux me charger de faire une version alternative moins performante.

Situphen commented 4 years ago

est-ce pertinent pour un si petit apport (les gens en version de développement avec une vieille version de SQLite) ?

Personnellement je ne pense pas, tant qu'il y a assez de développeurs avec la bonne version de Python/SQLite pour faire la QA de ce qui touche à cette fonctionnalité.

AmauryCarrade commented 4 years ago

Je propose de pour le moment, fermer de ticket, mais de le rouvrir si ça venait à devenir bloquant.

Donc surtout, n'hésitez pas. Mais je n'ai que peu de craintes, vu que SQLite 3.25.0 / Python 3.7.4 sont déjà vieux — tout le monde, y compris les gens sur des systèmes à versions figées, devrait l'avoir assez rapidement, si ce n'est pas déjà le cas.