Ошибка прокси-сервера AWS RDS (postgres) - прокси-сервер RDS в настоящее время не поддерживает параметры командной строки

Я пытаюсь читать или писать с / на прокси AWS RDS с postgres RDS в качестве конечной точки. Операция работает с psql, но не работает на том же клиенте с pg8000 или psycopg2, что и клиентские библиотеки в Python.

Операция работает с pg8000 и psycopg2, если я использую RDS напрямую в качестве конечной точки (без прокси RDS).

Сообщение об ошибке sqlaclchemy / psycopg2:

Feature not supported: RDS Proxy currently doesn’t support command-line options.

Минимальная версия кода, который я использую:

from sqlalchemy import create_engine

import os
from dotenv import load_dotenv
load_dotenv()

login_string = os.environ['login_string_proxy']
engine = create_engine(login_string, client_encoding="utf8", echo=True, connect_args={'options': '-csearch_path={}'.format("testing")})
engine.execute(f"INSERT INTO testing.mytable (product) VALUES ('123')")

pg8000: место остановки / ожидания чего-либо находится в core.py:

def sock_read(b):
            try:
                return self._sock.read(b)
            except OSError as e:
                raise InterfaceError("network error on read") from e

Минимальная версия кода, который я использую:

import pg8000

import os
from dotenv import load_dotenv
load_dotenv()

db_connection = pg8000.connect(database=os.environ['database'], host=os.environ['host'], port=os.environ['port'], user=os.environ['user'], password=os.environ['password'])
db_connection.run(f"INSERT INTO mytable (data) VALUES ('data')")
db_connection.commit()
db_connection.close()

Журналы в прокси-сервере RDS всегда выглядят нормально для всех упомянутых мною примеров, например:

A new client connected from ...:60614.
Received Startup Message: [username="", database="", protocolMajorVersion=3, protocolMinorVersion=0, sslEnabled=false]
Proxy authentication with PostgreSQL native password authentication succeeded for user "" with TLS off.
A TCP connection was established from the proxy at ...:42795 to the database at ...:5432.
The new database connection successfully authenticated with TLS off.

Я открыл все порты через группы безопасности на RDS и прокси RDS, и я использовал EC2 внутри VPC.

Я пробовал включать и выключать автокоммит.


person micha    schedule 24.04.2021    source источник
comment
Может из-за этих опций connect_args? Можете ли вы проверить без этого?   -  person Marcin    schedule 24.04.2021


Ответы (2)


Имеется в виду параметр командной строки -csearch_path={}.

Удалите это, а затем, когда соединение будет установлено, выполните set search_path = whatever в качестве первого запроса.

person jjanes    schedule 24.04.2021
comment
Спасибо, хорошая находка. Теперь он работает с sqlaclchemy / psycopg2. Но связь с модулем pg8000 все равно не работает. Так что в итоге, вероятно, проблема внутри pg8000. Я могу связаться с ними на их GitHub. - person micha; 26.04.2021
comment
Но что происходит с pg8000? Вы получаете сообщение об ошибке? Он просто висит вечно? - person jjanes; 26.04.2021
comment
Зависает навсегда. Я постараюсь сообщить им об этом в ближайшие дни. - person micha; 28.04.2021

Это известная проблема, из-за которой pg8000 не может подключиться к прокси-серверу AWS RDS (postgres). Я сделал PR https://github.com/tlocke/pg8000/pull/72 Посмотрим, одобрит ли изменение Тони Локк (отец pg8000). (в противном случае вам нужно изменить строки файла core.py https://github.com/tlocke/pg8000/pull/72/files)

    self._write(FLUSH_MSG)
    if (code != PASSWORD):
        self._write(FLUSH_MSG)
person grepit    schedule 03.05.2021
comment
Патч действительно был принят (спасибо @grepit) и находится в версии 1.19.4 pg8000. - person Tony Locke; 05.05.2021
comment
Спасибо Тони за быстрое рассмотрение этого вопроса. - person grepit; 06.05.2021
comment
Требуется помощь! У меня нет доступа к AWS, и я не могу понять, почему патч @ grepit работает, а версия 1.19.4 не работает. Обсуждение находится на github.com/tlocke/pg8000/pull/72, если у вас есть Любые идеи. Спасибо! - person Tony Locke; 11.05.2021
comment
@TonyLocke Я постараюсь потратить немного времени на эти выходные или на следующей неделе, чтобы попробовать это, и я расскажу вам о CR - person grepit; 12.05.2021