我正在设置远程PostgreSQL数据库。服务器正在运行CentOS 7和PostgreSQL-9.5。目前,我正在测试用户是否可以查询数据库。为此,我有以下内容:
import psycopg2
host = 'server1'
dbname = 'test_db'
user = 'test-user'
sslcert = 'test-db.crt'
sslmode = 'verify-full'
sslkey = 'test-db.key'
dsn = 'host={0} dbname={1} user={2} sslcert={3} sslmode={4} sslkey={5}'.format(host, dbname, user, sslcert, sslmode, sslkey)
conn = psycopg2.connect(dsn)
连接超时,出现以下错误:
psycopg2.OperationalError: could not connect to server: Connection timed out (0x0000274C/10060)
Is the server running on host "server1" (xx.xx.xx.xx) and accepting
TCP/IP connections on port 5432?
我尝试过几件事(如下所示)。我试图确定问题存在的哪一方:Python端或数据库配置:
sslmode
,sslcert
和sslkey
?我检查过以下内容:
service postgres-9.5 status
显示"有效")netstat -na | grep tcp
显示" LISTEN"在端口5432上)psql -U username -W -d test-db -h host
返回SSL connection (protocol: TLSAv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
user=test-user
已作为超级用户添加到postgres 我的理解是psycopg2
是现在使用的合适包。我已经搜索了documentation,但没有找到有关SSL连接的大量信息。我发现这个SO post使用psycog2
讨论了SSL连接,但我无法将某些语法与文档相匹配。
在Python脚本中,我在所有4种组合中尝试了以下内容:
sslmode='require'
test-db.crt
和test-db.key
答案 0 :(得分:1)
您似乎已经为自己展示了False Dilemma。问题不在于Python和数据库配置之间。其间存在可能导致断开的其他实体。
- Python语法是否正确?
是。语法在psycopg2.connect()
文档中描述。它的格式为:
psycopg2.connect(dsn=None, connection_factory=None, cursor_factory=None, async=False, **kwargs)
其中DSN(Data Source Name)可以作为单个字符串或单独的参数给出:
conn = psycopg2.connect(dsn="dbname=test user=postgres password=secret")
conn = psycopg2.connect(dbname="test", user="postgres", password="secret")
- 我在哪里可以找到有关DSN参数的文档,例如sslmode,sslcert和sslkey?
请注意,作为DSN参数,它们不是psycopg2
模块的一部分。它们由数据库定义,在本例中为Postgres。它们可以在Parameter Key Words部分的“数据库连接控制函数”一章中找到。
- 我应该问其他什么问题?
也许,
主机(PostgresSQL服务器)和客户端(本地Python实例)之间是否有任何阻止通信的东西?
对此的一个答案是"防火墙。"结果证明是问题所在。 Postgres正在倾听,Python正在接触。但门关上了。