web-dev-qa-db-fra.com

django.db.utils.InterfaceError: échecs de connexion déjà fermés lors de la mise à jour vers Django 3.0

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.

10
Federico B.

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.

2
schillingt

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:

  • Vérifiez quand la connexion est fermée et par quel test (exécutez-les individuellement via un script par exemple).
  • Pour les tests qui échouent, vérifiez le code pour les parties obsolètes de Django (recherche des éléments qui ont été supprimés/obsolètes entre 2.3 et 3.0).
  • Exécutez un linter pour voir si quelqu'un a changé une variable privée à l'intérieur de Django framework comme solution de contournement.
  • Vérifiez les transactions de postgres.

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.

1
Caveman

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.

1
bimmlerd

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 .

0
raven404

J'ai eu le même problème en utilisant pytest.

La rétrogradation de 5.4.1 à 5.3.5 l'a corrigé.

0
P4rk