无法将postgreSQL与psycopg2连接

问题描述 投票:0回答:10

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

>> 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 密码:
 数据库列表
         名称 |业主|编码 |整理| C型|访问权限
    ---------------+----------+------------+------------ +------------+------------------------
     检查数据库| postgres | UTF8 | en_US.utf8 | en_US.utf8 |
     数据库 | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
     postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
     模板0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
                   | | | | | postgres=CTc/postgres
     模板1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
                   | | | | | postgres=CTc/postgres

非常感谢!

postgresql psycopg2
10个回答
70
投票

您的 libpq(由 psycopg2 使用)期望 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"
)

12
投票

只有这样解决了我的问题, 建立指向 /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


11
投票

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


11
投票

本来是想评论Tometzky的回答,但是好吧,我这里有很多话要说...关于你不直接调用

psycopg2.connect
,而是使用第三方软件的情况.

tl;博士

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

简介

我在发行版存储库中尝试了 PostgreSQL 9.2 (CentOS 7) 和 9.5 (Ubuntu Xenial),在 CentOS 7 上从 PostgreSQL 存储库尝试了 PostgreSQL 9.3、9.4、9.5、9.6、10,在 Ubuntu Xenial 上从 PostgreSQL 存储库尝试了 PostgreSQL 9.6、10 。其中只有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的操作系统提供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

解决方案来自相应软件包的postinstall脚本:

$ 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
开关添加到
requirements.txt
:

psycopg2==2.7.3.2 --no-binary psycopg2

unix_socket_directories

更简单的选择是使用

unix_socket_directories
选项:


3
投票

几年后,在 OSX 10.8 上使用 EnterpriseDB“图形”安装,并使用 pip 安装 psycopg2(在链接 /Library/...dylib 的 后,如此处所述),我遇到了同样的问题。

对我来说正确的连接命令是

conn = psycopg2.connect('dbname=DBNAME user=postgres password=PWHERE host=/tmp/')


3
投票

就我而言,安装 conda 必须:

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


1
投票

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

根据这个答案中的建议,我运行了以下命令:

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.

我用谷歌搜索了那个致命错误,并根据这个答案中的建议我跑了:

brew postgresql-upgrade-database

这为我解决了问题。


0
投票

放置vpc_access_connector: 名称:项目//位置/us-central1/connectors/

和主机:'/cloudsql/::

它应该适用于 gcp 上的私有 IP postgresql


0
投票

尝试一次

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

此后更改线路

通过 Unix 域套接字进行数据库管理登录

本地所有 postgres peer

本地所有 postgres md5

然后执行以下命令

sudo systemctl stop postgresql

sudo systemctl start postgresql

然后运行python程序就可以正常运行了


0
投票

出现此问题是因为有时 postgres 连接 localhost-5433 而不是 localhost-5432 作为其他应用程序 可能正在使用 5432 端口。

试试这个:

con = pg2.connect(database='db', user='postgres', password='',port=5433)
© www.soinside.com 2019 - 2024. All rights reserved.