2014-09-25 58 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隧道更簡單易懂。

相關問題