Je mets à jour un projet de taille moyenne vers Django 3.0 et je rencontre plusieurs erreurs dans mes tests après n'avoir rien fait d'autre que de cogner la version Django version 2.3.
L'ensemble de la suite de tests fonctionne correctement depuis des années et je n'ai trouvé aucun changement pertinent dans le journal des modifications pouvant indiquer la cause de ce problème. Apparemment, un seul échec de test déclenche l'échec de chaque test restant dans la même classe TestCase avec l'exception suivante:
Traceback (most recent call last):
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/db/backends/base/base.py", line 238, in _cursor
return self._prepare_cursor(self.create_cursor(name))
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/utils/asyncio.py", line 24, in inner
return func(*args, **kwargs)
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/db/backends/postgresql/base.py", line 231, in create_cursor
cursor = self.connection.cursor()
psycopg2.InterfaceError: connection already closed
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/Users/federicobond/code/forks/core/apps/participants/tests/test_views.py", line 40, in setUp
self.client.force_login(self.user)
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/test/client.py", line 602, in force_login
self._login(user, backend)
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/test/client.py", line 611, in _login
if self.session:
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/test/client.py", line 461, in session
session.save()
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/contrib/sessions/backends/db.py", line 81, in save
return self.create()
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/contrib/sessions/backends/db.py", line 51, in create
self._session_key = self._get_new_session_key()
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/contrib/sessions/backends/base.py", line 162, in _get_new_session_key
if not self.exists(session_key):
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/contrib/sessions/backends/db.py", line 47, in exists
return self.model.objects.filter(session_key=session_key).exists()
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/db/models/query.py", line 777, in exists
return self.query.has_results(using=self.db)
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/db/models/sql/query.py", line 534, in has_results
return compiler.has_results()
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/db/models/sql/compiler.py", line 1107, in has_results
return bool(self.execute_sql(SINGLE))
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/db/models/sql/compiler.py", line 1135, in execute_sql
cursor = self.connection.cursor()
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/utils/asyncio.py", line 24, in inner
return func(*args, **kwargs)
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/db/backends/base/base.py", line 260, in cursor
return self._cursor()
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/db/backends/base/base.py", line 238, in _cursor
return self._prepare_cursor(self.create_cursor(name))
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/db/utils.py", line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/db/backends/base/base.py", line 238, in _cursor
return self._prepare_cursor(self.create_cursor(name))
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/utils/asyncio.py", line 24, in inner
return func(*args, **kwargs)
File "/Users/federicobond/code/forks/core/env/lib/python3.7/site-packages/Django/db/backends/postgresql/base.py", line 231, in create_cursor
cursor = self.connection.cursor()
Django.db.utils.InterfaceError: connection already closed
Je n'ai plus d'idées sur ce qui pourrait se passer ici.
Je suis tombé sur ça aussi. Cela semble être un bogue dans pytest-Django
. Voici le problème pertinent . Il y a un open PR pour le résoudre. Si c'est un inconvénient assez important, vous pouvez utiliser la branche dans ce PR ou épingler vos dépendances à une version antérieure.
Juste une note avant, il est presque impossible de fournir plus d'informations que ce qui est déjà dans le stacktrace. Cependant, vous pouvez enquêter:
Ensuite, une fois que vous avez quelle partie du code a l'erreur, réduisez-la en créant des tests d'échec plus petits.
Nous avons rencontré le même problème et la mise à niveau de Django 3.0.2 vers Django-3.0.4 l'a résolu. Il existe plusieurs correctifs liés à la base de données dans ces deux versions, mais je ne sais pas lequel l'un a résolu notre problème.
Tous ces problèmes se produisent en raison de l'incompatibilité des autres packages avec Django 3.0 lorsque j'ai rencontré cette erreur, j'ai mis à jour mon fichier requirements.txt manuellement, puis installé toutes les exigences en utilisant pip dans le même env .
J'ai eu le même problème en utilisant pytest.
La rétrogradation de 5.4.1 à 5.3.5 l'a corrigé.