django.db.utils.InterfaceError: kết nối đã bị lỗi khi cập nhật lên Django 3.0


9

Tôi đang cập nhật một dự án cỡ trung bình lên Django 3.0 và tôi gặp phải một số lỗi trong các thử nghiệm của mình sau khi không làm gì khác hơn là làm hỏng phiên bản Django từ 2.3.

Toàn bộ bộ kiểm tra đã chạy chính xác trong nhiều năm và tôi không thể tìm thấy bất kỳ thay đổi có liên quan nào trong thay đổi có thể chỉ ra nguyên nhân của vấn đề này. Rõ ràng một thử nghiệm thất bại đang kích hoạt mọi thử nghiệm còn lại trong cùng một lớp TestCase đều thất bại với ngoại lệ sau:

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

Tôi không có ý tưởng về những gì có thể xảy ra ở đây.


2
Vui lòng hiển thị dấu vết ngăn xếp đầy đủ và một phần mã có liên quan
Max Malysh

Tôi đã cập nhật vấn đề với một dấu vết ngăn xếp dài hơn. Thật không may, tôi không thể xác định chính xác nó đến một phần mã cụ thể.
Federico B.

1
Không, mọi thử nghiệm gây ra lỗi connection already closedcho tất cả các thử nghiệm còn lại trong lớp TestCase.
Federico B.

1
Một cách tốt để gỡ lỗi loại vấn đề này là nắm bắt lưu lượng cơ sở dữ liệu bằng cách sử dụng một cái gì đó như tcpdump và kiểm tra nó với Wireshark ; có vẻ như Postgres đang đóng kết nối để các truy vấn có thể tiết lộ lý do.
Irika Ticus

2
Tôi đã nhận thấy rằng nếu bạn sử dụng TransactionTestCase cho mọi thử nghiệm thay vì TestCase thì bằng cách nào đó nó sẽ không xảy ra. Tôi không hiểu làm thế nào hoặc tại sao.
jaredkwright

Câu trả lời:


2

Tôi cũng chạy vào đây. Nó dường như là một lỗi trong pytest-django. Đây là vấn đề có liên quan . Có một PR mở để giải quyết nó. Nếu đó là một sự bất tiện đủ lớn, bạn có thể sử dụng chi nhánh trong PR đó hoặc ghim các phụ thuộc của bạn vào phiên bản cũ hơn.


1

Chỉ cần một lưu ý về phía trước, gần như không thể cung cấp nhiều thông tin hơn trong stacktrace. Tuy nhiên, bạn có thể điều tra:

  • Kiểm tra khi kết nối được đóng lại và bằng cách kiểm tra (ví dụ chạy chúng thông qua tập lệnh).
  • Đối với các thử nghiệm thất bại, hãy kiểm tra mã cho các phần không dùng được của Django (tìm kiếm những thứ đã bị xóa / không dùng trong khoảng từ 2,3 đến 3.0).
  • Chạy một kẻ nói dối để xem ai đó đã thay đổi một biến riêng tư trong khung Django như một cách giải quyết.
  • Kiểm tra các giao dịch của postgres.

Sau đó, khi bạn có phần nào của mã có lỗi thu hẹp nó bằng cách tạo các thử nghiệm thất bại nhỏ hơn.


1

Chúng tôi đã gặp vấn đề tương tự và việc nâng cấp từ Django 3.0.2 lên Django-3.0.4 đã giải quyết nó. Có một số bản sửa lỗi liên quan đến DB trong hai phiên bản đó, nhưng tôi không biết bản nào đã giải quyết vấn đề của chúng tôi.


0

Tôi đã có cùng một vấn đề sử dụng pytest.

Việc hạ cấp từ 5.4.1 xuống 5.3.5 đã cố định nó.


0

Tất cả các sự cố này xảy ra do sự không tương thích của các gói khác với django 3.0 khi tôi gặp lỗi này, tôi đã cập nhật tệp request.txt của mình theo cách thủ công và sau đó đặt ra tất cả các yêu cầu bằng cách sử dụng pip trong cùng env.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.