【问题标题】:AWS RDS Proxy error (postgres) - RDS Proxy currently doesn’t support command-line optionsAWS RDS 代理错误 (postgres) - RDS 代理当前不支持命令行选项
【发布时间】:2021-05-04 02:50:54
【问题描述】:

我尝试使用 postgres RDS 作为端点读取或写入 AWS RDS 代理。 该操作适用于 psql,但在使用 pg8000 或 psycopg2 作为 Python 中的客户端库的同一客户端上失败。

如果我将 RDS 直接用作端点(没有 RDS 代理),则该操作适用于 pg8000 和 psycopg2。

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 代理上的安全组打开了所有端口,并在 VPC 内使用了 EC2。

我尝试开启和关闭自动提交。

【问题讨论】:

  • 可能是因为这些选项connect_args?没有那个你能检查吗?

标签: python postgresql amazon-web-services amazon-rds amazon-rds-proxy


【解决方案1】:

所指的“命令行选项”是-csearch_path={}

删除它,然后在建立连接后执行set search_path = whatever 作为您的第一个查询。

【讨论】:

  • 谢谢,很好的发现。它现在适用于 sqlaclchemy/psycopg2。但是与pg8000模块的连接还是不行。所以最后可能是pg8000内部的问题。我可能会在他们的 GitHub 上与他们联系。
  • 但是 pg8000 会发生什么?您收到错误消息?它只是永远挂起?
  • 永远挂起。我会尝试在接下来的几天内向他们报告。
【解决方案2】:

这是 pg8000 无法连接到 AWS RDS 代理 (postgres) 的已知问题。我做了一个 PR https://github.com/tlocke/pg8000/pull/72 看看 Tony Locke(pg8000 的父亲)是否批准这个改变。 (如果不是你必须更改 core.py https://github.com/tlocke/pg8000/pull/72/files 的行)

    self._write(FLUSH_MSG)
    if (code != PASSWORD):
        self._write(FLUSH_MSG)

【讨论】:

  • 补丁确实已经被接受(感谢@grepit)并且在pg8000版本1.19.4中。
  • 感谢 Tony 在这方面的快速周转时间。
  • 需要帮助!我无权访问 AWS,也无法弄清楚为什么 @grepit 的补丁有效而 1.19.4 版无效。如果您有任何想法,可以在github.com/tlocke/pg8000/pull/72 进行讨论。谢谢!
  • @TonyLocke 我会在这个周末或下周花一些时间尝试一下,我会在 CR 上更新你
猜你喜欢
  • 2022-06-23
  • 2021-10-05
  • 2021-08-05
  • 2020-07-31
  • 1970-01-01
  • 2021-03-12
  • 2022-01-15
  • 2020-11-14
  • 1970-01-01
相关资源
最近更新 更多