这是我第一次找不到关于某些技术问题的答案 这是我的问题:
>> 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"?
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
非常感谢!
答案 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
答案 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
的情况,但请使用第三方软件。
将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-psycopg2
或base
回购安装了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