无法将PostgreSQL与psycopg2连接

carvr3hs  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(9)|浏览(230)

这是我第一次找不到一些技术问题的答案。

>> 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正在运行
1.我的监听端口肯定是5432

  1. root@ lanston笔记本电脑:~# psql -l密码:
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

多谢了!

hvvq6cgz

hvvq6cgz1#

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"
)
fslejnso

fslejnso2#

只有这样才解决了我的问题,做一个符号链接到/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

z4iuyo4d

z4iuyo4d3#

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

gz5pxeao

gz5pxeao4#

我本来打算对Tometzky的回答做一个评论,但是好吧,我有很多话要说...关于你不直接调用psycopg2.connect,而是使用第三方软件的情况。

tl;dr

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

简介

我尝试了PostgreSQL 9.2(CentOS 7)和9.5(Ubuntu Xenial)从发行版库,PostgreSQL 9.3,9.4,9.5,9.6,10在CentOS 7从PostgreSQL repo,PostgreSQL 9.6,10在Ubuntu Xenial从PostgreSQL repo.其中只有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的baseupdate存储库安装了python-psycopg2,它会动态链接到操作系统提供的libpq。安装了9.3和9.4的操作系统提供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

另一方面,如果您将psycopg2pip一起安装,则默认情况下会安装预编译包,该包自带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开关添加到requirements.txt

psycopg2==2.7.3.2 --no-binary psycopg2

unix_socket_directories

更简单的方法是使用unix_socket_directories选项:

im9ewurl

im9ewurl5#

几年后,在OSX 10.8上使用EnterpriseDB 'graphical' install,并pip安装psycopg 2(在链接/Library/... dylib的as described here之后),我遇到了同样的问题。
我认为正确的连接命令是conn = psycopg2.connect('dbname=DBNAME user=postgres password=PWHERE host=/tmp/')

ha5z0ras

ha5z0ras6#

在我用康达安装的情况下不得不:sudo ln -s /var/run/postgresql/.s.PGSQL.5432 /tmp/.s.PGSQL.5432

j9per5c4

j9per5c47#

在一次brew upgrade之后,我遇到了这种情况,我在谷歌上搜索了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

这对我来说已经解决了。

jutyujz0

jutyujz08#

输入vpc访问连接器:名称:项目//位置/us-central 1/连接器/
和主机:'/cloudsql/::
它应该适用于gcp上的私有IP postgresql

hs1rzwqc

hs1rzwqc9#

试一次

cd /etc/postgresql/13/main
vi pg_hba.conf

在此之后更改行
通过Unix域套接字进行数据库管理登录
本地所有postgres***对等***
结束日期
本地所有postgres***md5***
然后执行以下命令

sudo systemctl stop postgresql

sudo systemctl start postgresql

然后运行python程序,它将正常工作

相关问题