Курсор (SQL) - разорвать соединение после развертывания сайта на удаленном сервере - PullRequest
0 голосов
/ 13 мая 2018

после развертывания моего веб-сайта (Django + NGINX + uwsgi) у меня проблема с соединениями SQL. Когда я запускаю wscgi в первый раз, после выхода из более раннего экземпляра, сайт корректно загружается через веб-браузер (соединение SQL установлено, и запрос выполнен, я получаю результат). После перехода на следующий сайт (следующий запрос должен быть выполнен) я получаю сообщения об ошибках, как показано ниже:

[pid: 26143|app: 0|req: 1/1] 2001:470:70:f5f::2 () {58 vars in 1057 bytes} [Sun May 13 19:03:54 2018] GET /index/ => generated 270 bytes in 712 msecs (HTTP/1.0 200) 4 headers in 123 bytes (1 switches on core 0)
[pid: 26143|app: 0|req: 2/2] 2001:470:70:f5f::2 () {56 vars in 1044 bytes} [Sun May 13 19:04:07 2018] GET /accounts/login/ => generated 634 bytes in 41 msecs (HTTP/1.0 200) 7 headers in 380 bytes (1 switches on core 0)
[pid: 26143|app: 0|req: 3/3] 2001:470:70:f5f::2 () {60 vars in 1170 bytes} [Sun May 13 19:04:17 2018] POST /accounts/login/ => generated 0 bytes in 2570 msecs (HTTP/1.0 302) 9 headers in 531 bytes (1 switches on core 0)
Internal Server Error: /index/
Traceback (most recent call last):
  File "/root/Env/pyrat/lib/python3.5/site-packages/django/db/backends/utils.py", line 83, in _execute
    return self.cursor.execute(sql)
psycopg2.InterfaceError: cursor already closed

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

Traceback (most recent call last):
  File "/root/Env/pyrat/lib/python3.5/site-packages/django/core/handlers/exception.py", line 35, in inner
    response = get_response(request)
  File "/root/Env/pyrat/lib/python3.5/site-packages/django/core/handlers/base.py", line 128, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/root/Env/pyrat/lib/python3.5/site-packages/django/core/handlers/base.py", line 126, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/root/Env/pyrat/pyrat_server/views.py", line 28, in index
    dbquery.execute('SELECT * FROM users')
  File "/root/Env/pyrat/lib/python3.5/site-packages/django/db/backends/utils.py", line 68, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/root/Env/pyrat/lib/python3.5/site-packages/django/db/backends/utils.py", line 77, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/root/Env/pyrat/lib/python3.5/site-packages/django/db/backends/utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "/root/Env/pyrat/lib/python3.5/site-packages/django/db/utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/root/Env/pyrat/lib/python3.5/site-packages/django/db/backends/utils.py", line 83, in _execute
    return self.cursor.execute(sql)
django.db.utils.InterfaceError: cursor already closed
[pid: 26143|app: 0|req: 4/4] 2001:470:70:f5f::2 () {56 vars in 1079 bytes} [Sun May 13 19:04:20 2018] GET /index/ => generated 27 bytes in 784 msecs (HTTP/1.0 500) 4 headers in 126 bytes (1 switches on core 0)

База данных находится на elephantSQL (Postgres). Когда я попробовал приложение на localhost - проблем не было. У кого-нибудь были такие проблемы?

1 Ответ

0 голосов
/ 20 мая 2018

Если у кого-то есть подобная проблема - на моем локальном хосте достаточно одного подключения к базе данных (в начале).После этого я могу сделать любой запрос, и нет проблем с подключением.К сожалению, на удаленном хосте (сервере) каждый раз перед запросом должно быть установлено новое соединение с базой данных.Ниже приведен код, который я использую:

def db_fetchall(query):
    try:
        dbquery = connection.cursor()
        dbquery.execute(query)
    except InterfaceError:
        dbquery.close()
        dbquery = connection.cursor()
        dbquery.execute(query)
    return dbquery.fetchall()
...