2012-05-31 94 views
6

我花了幾個小時來解決這些問題,但沒有達到任何內容。網絡上有關於這個問題的幾個主題,但他們都沒有說要解決這個問題。Postgresql和django - Unix域套接字

我剛剛安裝了postgresql,以便在我的django項目中使用它。

DATABASES = { 
    "default": { 
     "ENGINE": "django.db.backends.postgresql_psycopg2", # Add "postgresql_psycopg2", "postgresql", "mysql", "sqlite3" or "oracle". 
     "NAME": "name",      # Or path to database file if using sqlite3. 
     "USER": "postgres",        # Not used with sqlite3. 
     "PASSWORD": "pass",       # Not used with sqlite3. 
     "HOST": "",        # Set to empty string for localhost. Not used with sqlite3. 
     "PORT": "",        # Set to empty string for default. Not used with sqlite3. 
    } 
} 

這是我的settings.py和錯誤是

could not connect to server: No such file or directory 
    Is the server running locally and accepting 
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"? 

有沒有人有一個關於它的解決方案嗎?

+0

爲什麼你的'HOST'和'PORT'是空的?如果你在本地運行你的django服務器,那麼你必須至少指定'HOST':'localhost' – stalk

+0

你的系統和版本是什麼?你是如何安裝Postgresql的 - 從源代碼,從分發包或從安裝程序?您是否檢查過Postgres服務真的在運行? Postgres套接字在哪裏?'/ var/run/postgresql/.s.PGSQL.5432'或'/ tmp/.s.PGSQL.5432'或在其他地方。你能用'psql'連接嗎?對於幾個小時的工作,你不提供太多的信息來處理。 – Tometzky

+0

Debian 6。主機和端口是空的,因爲我在本地主機上無需填寫它 – user1407540

回答

15

您需要找到postgres套接字。檢查主postgres進程pid(ps auxw | grep postgres)並列出其打開的unix套接字(lsof -p [PID_OF_POSTGRES_PROCESS] | grep unix)。將此路徑寫入settings.py中的HOST選項。

從分發包(apt-get install postgresql)安裝Postgres會更容易(例如settings.py中的空主機將工作),並且安全,因爲您的發行版將爲您安裝安全更新。

+3

另外,作爲'lsof'的替代方法,標準的方法是簡單地查找'postgresql.conf'服務器配置文件的'unix_socket_directory'條目。 –

+0

謝謝。有用。 apt-get install postgresql安裝舊版本的postgresql。我做的是,我剛從官方網站安裝了9.1。 apt-get install postgresql定位django主機的位置,但manuel install將它安裝在不同的目錄中。 – user1407540

+2

對最新版本的需求是大多數管理員喜歡使用[backports](http://backports-master.debian.org/)處理的常見問題。除了自動升級等其他好處之外,9.1的backport可以避免在這裏需要解決的路徑上的庫/服務器不匹配問題。 –

11

這是另一種可能性:如果您在現有版本上安裝了PostgreSQL的新版本,安裝程序可能會爲其分配一個非標準端口號。

Django希望PostgreSQL監聽端口5432.即使你使用的是Unix套接字,套接字也是以端口號命名的,所以這仍然很重要!

檢查/etc/postgresql/<version>/main/postgresql.conf的行port = nnnn。如果這個數字不是5432,那就是你的問題。另一個指標是/var/run/postgresql中的套接字文件將被稱爲.s.PGSQL.5433,使用非標準端口號。

要解決它,你可以編輯端口號postgresql.conf使用默認值(5432),或者如果你需要它在一個非標準的端口號運行,然後在你的Django settings.py設置DATABASE_PORT = 'nnnn'

感謝Erik Forsberg作爲指針!

2

在當代Fedora系統中,添加了一個私人臨時目錄功能,這會導致此症狀。 https://fedoraproject.org/wiki/Features/ServicesPrivateTmp

此功能會導致Web應用程序使用tmp目錄,該目錄不同於默認的PostgreSQL域所在的system/tmp目錄。

要更改systemd指令,此功能適用於Apache的httpd在Fedora上編輯文件/usr/lib/systemd/system/httpd.service並更改PrivateTmp=truePrivateTmp=false

或者,你能避免使用域套接字來避免這個問題。