2012-05-31 59 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

或者,你能避免使用域套接字来避免这个问题。