2014-09-25 95 views
1

我无法使用python和psycopg2远程连接到PostgreSQL:以postgres用户身份连接到PostgreSQL时出现连接错误?

这是我的代码。

>>> import psycopg2 
>>> conn_string = "host='localhost' dbname='mydb' user='postgres'" 
>>> print "Connecting to database\n  ->%s" % (conn_string) 
    Connecting to database 
     ->host='localhost' dbname='mydb' user='postgres' 
>>> conn = psycopg2.connect(conn_string) 

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "/home/tools/lib/python2.7/site-packages/psycopg2/__init__.py", line 164, in connect 
conn = _connect(dsn, connection_factory=connection_factory, async=async) 
psycopg2.OperationalError: could not connect to server: Connection refused 
Is the server running on host "localhost" (::1) and accepting 
TCP/IP connections on port 5432? 

无法连接到服务器:连接被拒绝 是运行在主机上的服务器的“本地主机”(127.0.0.1)和接收端口5432 TCP/IP连接?

密码未设置为postgres用户。

通常,我可以通过在主机上运行以下方法连接到数据库。

1. SSH to box 
2. su - postgres 
3. psql 
4. \c mydb 

服务器运行PostgreSQL 9.1。

+0

_I无法远程连接到psql:除非您设置了一个您没有告诉的SSH隧道,否则您甚至不用'host = localhost'尝试。 – 2014-09-25 08:59:14

+0

嗯,“*服务器是否在主机”localhost“(:: 1)上运行,并且在端口5432上接受 TCP/IP连接?*”? – 2014-09-25 13:34:25

+0

@DanielVérité我发现新用户在谈论将ssh变成一个盒子时,似乎会说“远程服务器”,然后将运行在远程机器上的代码与同一远程主机上的数据库建立连接。它是一个“远程服务器”,即使远程数据库连接的目的是无关紧要的。这可能是这样的情况,最后是通过笔记。 – 2014-09-25 13:35:47

回答

2

您正尝试使用在您的计算机上运行的脚本连接到PostgreSQL的localhost,但没有运行PostgreSQL服务器。

为此,您必须ssh到远程服务器,然后在那里运行您的Python脚本,其中PostgreSQL服务器相对于Python脚本是“本地”的。

(这就是为什么运行psql作品 - 因为你的远程服务器,在PostgreSQL是“局部”相对于psql上运行它)。

或者,您可以:

  • 使用SSH隧道来前进PostgreSQL的端口从本地计算机到远程之一;或

  • 在服务器上启用远程连接后,使用其主机名或IP地址直接通过TCP/IP连接到远程PostgreSQL服务器。

注意,只是把服务器的IP地址或主机名到连接字符串,而不是localhost将无法​​正常工作除非你也将服务器配置为接受远程连接。您必须设置listen_addresses以侦听非本地连接,添加任何所需的防火墙规则,设置pg_hba.conf以允许来自远程计算机的连接,并且最好设置SSL。所有这些都在PostgreSQL用户手册的客户端身份验证章节中介绍。

您可能会发现SSH隧道更简单易懂。