无法使用psycopg2连接postgreSQL

时间:2011-03-31 13:07:35

标签: postgresql psycopg2

这是我第一次找不到关于某些技术问题的答案 这是我的问题:

>> conn=psycopg2.connect(database="mydb", user="postgres", password="123",port=5432)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
psycopg2.OperationalError: 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"?
  1. 我的postgreSQL正在运行
  2. 我的监听端口肯定是5432
  3. root @ lanston-laptop:〜#psql -l 密码:
  4.                                        List of databases
             Name      |  Owner   | Encoding | Collation  |   Ctype    |   Access privileges 
        ---------------+----------+----------+------------+------------+-----------------------
         checkdatabase | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
         mydb          | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
         postgres      | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
         template0     | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
                       |          |          |            |            | postgres=CTc/postgres
         template1     | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
                       |          |          |            |            | postgres=CTc/postgres
    

    非常感谢!

7 个答案:

答案 0 :(得分:54)

psycopg2使用的libpq期望Postgres套接字位于/var/run/postgresql/但是当您从源代码安装Postgres时,它默认位于/tmp/

检查是否有文件/tmp/.s.PGSQL.5432而不是/var/run/postgresql/.s.PGSQL.5432。尝试:

conn=psycopg2.connect(
  database="mydb",
  user="postgres",
  host="/tmp/",
  password="123"
)

答案 1 :(得分:7)

尝试将端口更改为5433而不是5432

答案 2 :(得分:4)

只有这解决了我的问题, 建立一个指向/tmp/.s.PGSQL.5432的符号链接:

sudo ln -s /tmp/.s.PGSQL.5432 /var/run/postgresql/.s.PGSQL.5432

感谢Sukhjit Singh Sehra - s-postgresql-server-is-running

答案 3 :(得分:3)

几年后,使用OSX 10.8上的EnterpriseDB 'graphical' install和psycopg2的pip安装(在链接/Library/...dylib的as described here之后),我遇到了同样的问题。

对我来说,正确的连接命令是conn = psycopg2.connect('dbname=DBNAME user=postgres password=PWHERE host=/tmp/')

答案 4 :(得分:1)

我原本打算对Tometzky的回答发表评论,但是,我在这里有很多话要说......关于你不直接致电psycopg2.connect的情况,但请使用第三方软件。

TL;博士

unix_socket_directories中的postgresql.conf设置为/var/run/postgresql, /tmp,然后重新启动PostgreSQL。

介绍

我在发行版上尝试了PostgreSQL 9.2(CentOS 7)和9.5(Ubuntu Xenial),来自PostgreSQL repo的CentOS 7上的PostgreSQL 9.3,9.4,9.5,9.6,10,来自{{0}}的Ubuntu Xenial上的PostgreSQL 9.6,10 {3}}。其中只有9.3只听/tmp

$ systemctl stop postgresql-9.4 && systemctl start postgresql-9.3
$ lsof -aUp $(ps --ppid 1 -o pid= -o comm= | awk '$2 == "postgres" || $2 == "postmaster" {print $1}')
COMMAND    PID     USER   FD   TYPE             DEVICE SIZE/OFF    NODE NAME
postgres 25455 postgres    4u  unix 0xffff9acb23bc5000      0t0 6813995 /tmp/.s.PGSQL.5432

$ systemctl stop postgresql-9.3 && systemctl start postgresql-9.4
$ lsof -aUp $(ps --ppid 1 -o pid= -o comm= | awk '$2 == "postgres" || $2 == "postmaster" {print $1}')
COMMAND    PID     USER   FD   TYPE             DEVICE SIZE/OFF    NODE NAME
postgres 26663 postgres    4u  unix 0xffff9ac8c5474c00      0t0 7086508 /var/run/postgresql/.s.PGSQL.5432
postgres 26663 postgres    5u  unix 0xffff9ac8c5477c00      0t0 7086510 /tmp/.s.PGSQL.5432

python-psycopg2

这与psql没什么关系,只是运行匹配的二进制文件。但是,例如,如果你从CentOS的python-psycopg2base回购安装了update。它动态链接到操作系统提供的libpq。安装9.3和9.4后OS提供9.4版本:

$ alternatives --display pgsql-ld-conf
pgsql-ld-conf - status is auto.
 link currently points to /usr/pgsql-10/share/postgresql-9.4-libs.conf
/usr/pgsql-9.3/share/postgresql-9.3-libs.conf - priority 930
/usr/pgsql-9.4/share/postgresql-9.4-libs.conf - priority 940
Current `best' version is /usr/pgsql-9.4/share/postgresql-9.4-libs.conf.

$ ls -l /etc/ld.so.conf.d
lrwxrwxrwx 1 root root 31 Feb  7 02:25 postgresql-pgdg-libs.conf -> /etc/alternatives/pgsql-ld-conf

$ ls -l /etc/alternatives/pgsql-ld-conf
lrwxrwxrwx 1 root root 43 Feb  7 02:25 /etc/alternatives/pgsql-ld-conf -> /usr/pgsql-9.4/share/postgresql-9.4-libs.conf

$ cat /usr/pgsql-9.4/share/postgresql-9.4-libs.conf
/usr/pgsql-9.4/lib/

但PostgreSQL 9.4附带的libpq/var/run/postgresql中寻找套接字而不是9.3:

$ strings /usr/pgsql-9.3/lib/libpq.so.5 | egrep '/(tmp|var)'
/tmp

$ strings /usr/pgsql-9.4/lib/libpq.so.5 | egrep '/(tmp|var)'
/var/run/postgresql

解决方案来自相应软件包的安装后脚本:

$ yum reinstall --downloadonly postgresql94-libs
$ rpm -qp /var/cache/yum/x86_64/7/pgdg94/packages/postgresql94-libs-9.4.15-1PGDG.rhel7.x86_64.rpm --scripts

postinstall scriptlet (using /bin/sh):
/usr/sbin/update-alternatives --install /etc/ld.so.conf.d/postgresql-pgdg-libs.conf   pgsql-ld-conf        /usr/pgsql-9.4/share/postgresql-9.4-libs.conf 940
/sbin/ldconfig                                                                                 

# Drop alternatives entries for common binaries and man files                                  
postuninstall scriptlet (using /bin/sh):                                                       
if [ "$1" -eq 0 ]
  then
    /usr/sbin/update-alternatives --remove pgsql-ld-conf /usr/pgsql-9.4/share/postgresql-9.4-libs.conf
    /sbin/ldconfig                                                                             
fi

暂时删除9.4的备选方案:

$ alternatives --remove pgsql-ld-conf /usr/pgsql-9.4/share/postgresql-9.4-libs.conf
$ ldconfig

完成后重新安装postgresql94-libs,或添加替代选项:

$ alternatives --install /etc/ld.so.conf.d/postgresql-pgdg-libs.conf pgsql-ld-conf /usr/pgsql-9.4/share/postgresql-9.4-libs.conf 940
$ ldconfig

pip

另一方面,如果您使用psycopg2安装pip,则默认安装预编译的软件包,该软件包附带自己的libpq,它会在/var/run/postgresql中查找套接字:

$ python3.5 -m venv 1
$ . ./1/bin/activate
(1) $ pip install psycopg2

(1) $ python
>>> import psycopg2
>>>Ctrl-Z
[1]+  Stopped                 python

(1) $ pgrep python
26311

(1) $ grep libpq /proc/26311/maps | head -n 1
7f100b8cb000-7f100b90e000 r-xp 00000000 08:04 112980                     /home/yuri/1/lib/python3.5/site-packages/psycopg2/.libs/libpq-909a53d8.so.5.10

(1) $ strings /home/yuri/1/lib/python3.5/site-packages/psycopg2/.libs/libpq-909a53d8.so.5.10 | egrep '/(tmp|var)'
/var/run
/var/run/postgresql

解决方案是要求pip不安装预编译的软件包,并使pg_config提供正确版本的PostgreSQL:

$ PATH=/usr/pgsql-9.3/lib:$PATH pip install --no-binary psycopg2 psycopg2

您甚至可以添加--no-binary切换到PostgreSQL repo

psycopg2==2.7.3.2 --no-binary psycopg2

unix_socket_directories

更简单的选择是使用requirements.txt

答案 5 :(得分:0)

brew upgrade之后发生这种情况,我在Google上搜索了brew .s.PGSQL.5432

根据this answer中的建议,我执行了以下操作:

postgres -D /usr/local/var/postgres

得到了:

2019-10-29 17:43:30.860 IST [78091] FATAL:  database files are incompatible with server
2019-10-29 17:43:30.860 IST [78091] DETAIL:  The data directory was initialized by PostgreSQL version 10, which is not compatible with this version 11.5.

我搜索了致命错误,并按照this answer中的建议跑了:

brew postgresql-upgrade-database

那为我解决了。

答案 6 :(得分:0)

就我而言,使用conda安装必须:sudo ln -s /var/run/postgresql/.s.PGSQL.5432 /tmp/.s.PGSQL.5432