как исправить "OperationalError: (psycopg2.OperationalError) сервер неожиданно закрыл соединение" - PullRequest
0 голосов
/ 01 апреля 2019

Сервисы

Мой сервис основан на флешке + postgresql + gunicorn + supervisor + nginx

При развертывании через docker, после запуска сервиса, затем доступа к API, иногда он сообщал об ошибкеи иногда это работает хорошо.

И база данных sqlachemy connect добавляет параметры 'sslmode:disable'.

File "/usr/local/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 287, in _execute_on_connection
    Return connection._execute_clauseelement(self, multiparams, params)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1107, in _execute_clauseelement
    Distilled_params,
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1248, in _execute_context
    e, statement, parameters, cursor, context
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1466, in _handle_dbapi_exception
    Util.raise_from_cause(sqlalchemy_exception, exc_info)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 383, in raise_from_cause
    Reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1244, in _execute_context
    Cursor, statement, parameters, context
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 552, in do_execute
    Cursor.execute(statement, parameters)
OperationalError: (psycopg2.OperationalError) server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.

Информация

Docker для Mac: версия: 2.0.0.3(31259)

macOS: версия 10.14.2

Python: версия 2.7.15

Метод повторения

При просмотре информации о порте по команде

lsof -i:5432

порт 5432 является портом базы данных postgresql по умолчанию ,, если outputconsole был

COMMAND    PID        USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
postgres 86469 user    4u  IPv6 0xxddd      0t0  TCP *:postgresql (LISTEN)
postgres 86469 user    5u  IPv4 0xxddr      0t0  TCP *:postgresql (LISTEN)

, он отображал бы сообщение об ошибке:

OperationalError: (psycopg2.OperationalError) server closed the connection unexpectedly

, но если outputconsolelog показывает это:

COMMAND     PID        USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
com.docke 62421 user   26u  IPv4 0xe93      0t0  TCP 192.168.2.7:6435->192.168.2.7:postgresql (ESTABLISHED)
postgres  86460 user    4u  IPv6 0xed3      0t0  TCP *:postgresql (LISTEN)
postgres  86460 user    5u  IPv4 0xe513      0t0  TCP *:postgresql (LISTEN)
postgres  86856 user   11u  IPv4 0xfe93      0t0  TCP 192.168.2.7:postgresql->192.168.2.7:6435 (ESTABLISHED)

ситуация, API будет работать хорошо.

Becauce из Docker для Mac?

Ссылка ссылка https://github.com/docker/for-mac/issues/2442, проблема не можетрешить мою проблему.

Заметили похожую проблему?

ink Python & Sqlalchemy - Схема подключения -> Случайно отключается от удаленного сервера

и эта проблема не может решить мою проблему.

Решение

flask_sqlachemy нужен параметр pool_pre_ping

from flask_sqlalchemy import SQLAlchemy as _BaseSQLAlchemy

class SQLAlchemy(_BaseSQLAlchemy):
    def apply_pool_defaults(self, app, options):
        super(SQLAlchemy, self).apply_pool_defaults(self, app, options)
        options["pool_pre_ping"] = True

db = SQLAlchemy()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...