【问题标题】:Connecting to Azure PostgreSQL server from python psycopg2 client从 python psycopg2 客户端连接到 Azure PostgreSQL 服务器
【发布时间】:2020-11-13 11:19:34
【问题描述】:

我无法从 python 连接到 Azure postgres 数据库。我在这里遵循指南 - https://docs.microsoft.com/cs-cz/azure/postgresql/connect-python 我有基本相同的代码来建立连接。 但是 psycopg2 和 SQLalchemy 给我带来了同样的错误:

OperationalError: server closed the connection unexpectedly
  This probably means the server terminated abnormally
  before or while processing the request.

我可以通过 dbeaver 等其他客户端工具连接到实例,但从 python 中它不起作用。

当我在 Postgres 日志中进行调查时,我可以看到服务器实际上授权了连接,但下一行显示

 could not receive data from client: An existing connection was forcibly closed by the remote host.

Python 是 3.7 psycopg 的版本是 2.8.5 Azure Postgres 区域位于西欧

有人对我应该如何尝试使其工作有任何建议吗?

谢谢!

编辑: 问题自己解决了。几天后我尝试了相同的设置,它开始工作了。 Azure West Europe 可能有问题。

【问题讨论】:

  • 间歇性地面临同样的问题。我们有一个每天运行 8 小时的负载。每周至少一次失败,我们必须重新触发。痛苦。我们的 Postgres 服务器上有大量未使用的资源,所以这不是问题。看起来它与维护模式有关。

标签: python-3.x postgresql azure psycopg2


【解决方案1】:

我也有这个问题。我想我在某处(我忘了在哪里)读到 Azure 对用户名 (user@serverName) 的 @ 有问题。

我创建了变量和一个 f 字符串,然后它就可以正常工作了。

import sqlalchemy    

username = 'user@server_name'
password = 'PassWord!'
host = 'server_name.postgres.database.azure.com'
database = 'your_database'

conn_str = f'postgresql+psycopg2://{username}:{password}@{host}/{database}'

之后:

engine = sqlalchemy.create_engine(conn_str, pool_pre_ping=True)
conn = engine.connect()

使用简单的 SQL 语句对其进行测试。

sql = 'SELECT * FROM public.some_table;'
results = conn.engine.execute(sql)

这是英国南部的一个连接。在此之前,它确实抱怨用户名的格式必须使用@,尽管用户名是正确的,在命令行中使用 PSQL 和另一个 SQL 客户端进行了测试。

【讨论】:

  • 我认为你是对的。关键点是用户名是username@server。一个奇怪的怪癖是当我们创建一个实例副本并在需要时尝试使用username@server 连接到它username@server_copy。最奇怪的是我们连接(!)但连接到错误的实例。不是主机中的一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2017-05-08
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多