Python - psycopg2 дает ошибку после исполнения - PullRequest
7 голосов
/ 17 апреля 2020

Я получаю эту ошибку при выполнении моего кода в Python.

Вот мой Python - DataBaseHelper.py:

import psycopg2
#class
class DataBaseHelper:
    database = "testdata";user = "test";password = "pass123"; host = "mtest.75tyey.us-east-1.rds.amazonaws.com"

    #create and return the connection of database
    def getConection(self):
        self.conn = psycopg2.connect(database=self.database, user = self.user, password = self.password, host = self.host, port = "5432")
        return self.conn

Затем я импортирую этот файл и использую в другом файле python - MyScript.py:

import sys
import uuid
from DBHelper import DataBaseHelper
from ExecutionLogHelper import ExecutionLogHelper
from GotUtility import GotUtility


class MyScript:
   def __init__(self,):
        self.con = DataBaseHelper().getConection()
        self.logHelper = ExecutionLogHelper()
        self.uuid = self.logHelper.Get_TEST_Run_Id()

Когда я запускаю свой код одновременно, это выдает мне эту ошибку:

psycopg2.errors.AdminShutdown: terminating connection due to administrator command
SSL connection has been closed unexpectedly

Я не могу понять, почему я получаю эту ошибку. Когда я снова запускаю программу Python, она работает. И я проверил, что Postgres сервер работает, нет перезагрузки, нет сигнала на выключение. Это продолжается для меня каждые несколько часов.

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Это происходит потому, что psycopg2 пытается подключиться к AWS Postgresql по SSL и не может это сделать.

  1. Попробуйте подключиться с помощью sslmode = отключить

    def getConection(self):
        self.conn = psycopg2.connect(database=self.database,
                                     user = self.user,
                                     password = self.password,
                                     host = self.host,
                                     port = "5432",
                                     sslmode="disable")
        return self.conn
    
    
    
  2. Метод 1 не будет работать, если ваш AWS Postgresql настроен на принудительное соединение ssl ie. параметр rds.force_ssl = 1. Если вы включите настройку rds.force_ssl, все соединения не-SSL будут отклонены. В этом случае попробуйте подключиться, используя что-то вроде этого:

    $ psql -h testpg.cdhmuqifdpib.us-east-1.rds.amazonaws.com -p 5432 "dbname=testpg user=testuser sslrootcert=rds-ca-2015-root.pem sslmode=verify-full"

Подробнее о том, как подключиться к AWS RDS через ssl с использованием различных драйверов: AWS RDS SSL . Это мой первый ответ на stackoverflow, надеюсь, он решит вашу проблему.

0 голосов
/ 20 апреля 2020

После небольшой копки я нашел несколько ответов. Согласно этой ссылке :

Это сообщение об ошибке появляется в результате вмешательства программы, внешней по отношению к Postgres: http://www.postgresql.org/message-id/4564.1284559661@sss.pgh.pa.us

Чтобы уточнить, эта ссылка говорит:

Если пользователь остановит postgresql сервер с "service postgresql stop" или если какой-либо SIGINT был вызван на postgresql PID, тогда эта ошибка возникнет.

Решение: Поскольку ваш код выполняется одновременно, причиной нескольких ошибок одновременно может быть несколько транзакций в одной и той же строке. Таким образом, вы должны убедиться, что этого не произойдет ... Подробнее смотрите здесь :

Когда вы обновляете строки в транзакции, эти строки блокируются пока транзакция не будет совершена.

Если вы не можете это сделать, я предлагаю вам включить ведение журнала запросов и посмотреть, есть ли в нем что-то странное.

...