无法将 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"?
- 我的 postgreSQL 正在运行
- 我的监听端口肯定是 5432
- root@lanston-laptop:~# 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
非常感谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
psycopg2 使用的 libpq 期望 Postgres 套接字位于
/var/run/postgresql/
中,但是当您从源代码安装 Postgres 时,默认情况下它位于/tmp/
中>。检查是否存在文件
/tmp/.s.PGSQL.5432
而不是/var/run/postgresql/.s.PGSQL.5432
。尝试:Your libpq, which is used by psycopg2 expects Postgres socket to be in
/var/run/postgresql/
but when you install Postgres from source it is by default it in/tmp/
.Check if there is a file
/tmp/.s.PGSQL.5432
instead of/var/run/postgresql/.s.PGSQL.5432
. Try:尝试将端口更改为 5433 而不是 5432
Try change port to 5433 instead of 5432
只有这样解决了我的问题
建立一个指向 /tmp/.s.PGSQL.5432 的符号链接:
感谢 Sukhjit Singh Sehra - s-postgresql-server-is-running
Only this solved my problem,
make a symbolic link to the /tmp/.s.PGSQL.5432:
Thanks to, Sukhjit Singh Sehra - s-postgresql-server-is-running
我原本打算将其作为对 Tometzky 的答案的评论,但是好吧,我在这里有很多话要说。关于不直接调用
psycopg2.connect
,而是使用第三方软件的情况。tl;dr
将
postgresql.conf
中的unix_socket_directories
设置为/var/run/postgresql, /tmp
,然后重新启动PostgreSQL。我尝试了发行
版存储库中的 PostgreSQL 9.2 (CentOS 7) 和 9.5 (Ubuntu Xenial),CentOS 7 上的 PostgreSQL 9.3、9.4、9.5、9.6、10,来自 PostgreSQL 存储库、PostgreSQL 9.6、10来自 PostgreSQL 存储库。其中只有 9.3 只监听
/tmp
:python-psycopg2
这对
psql
来说没什么大不了的,只是运行匹配的二进制文件的问题。但是,例如,如果您从 CentOS 的base
或update
存储库安装了python-psycopg2
。它动态链接到操作系统提供的libpq
。安装了 9.3 和 9.4 的操作系统提供了 9.4 的版本:但是 PostgreSQL 9.4 附带的
libpq
会在/var/run/postgresql
中查找套接字,而不是 9.3:解决方案来自相应软件包的安装后脚本:
暂时删除 9.4 的替代方案:
完成后,重新安装
postgresql94-libs
,或添加替代方案:pip
另一方面,如果您使用
pip
安装psycopg2
,它默认会安装预编译包,该包带有自己的libpq,在
/var/run/postgresql
中查找套接字:解决方案是要求
pip
不要安装预编译包,并进行pg_config
> 的正确版本PostgreSQL 可用:您甚至可以将
--no-binary
开关添加到requirements.txt
:unix_socket_directories
不过更简单的选择是使用
unix_socket_directories
选项:I originally intended to make it a comment to Tometzky's answer, but well, I have a lot to say here... Regarding the case where you don't call
psycopg2.connect
directly, but use third-party software.tl;dr
Set
unix_socket_directories
inpostgresql.conf
to/var/run/postgresql, /tmp
, and restart PostgreSQL.intro
I tried PostgreSQL 9.2 (CentOS 7) and 9.5 (Ubuntu Xenial) from distro repos, PostgreSQL 9.3, 9.4, 9.5, 9.6, 10 on CentOS 7 from PostgreSQL repo, PostgreSQL 9.6, 10 on Ubuntu Xenial from PostgreSQL repo. Among them only 9.3 listens to only
/tmp
:python-psycopg2
That's not a big deal with
psql
, just a matter of running the matching binary. But if you, for instance, havepython-psycopg2
installed from CentOS'sbase
orupdate
repo. It links dynamically tolibpq
that OS provides. With 9.3 and 9.4 installed OS provides 9.4's version:But
libpq
that comes with PostgreSQL 9.4 looks for socket in/var/run/postgresql
as opposed to 9.3:The solution comes from postinstall scripts of corresponding packages:
Temporarily remove 9.4's alternative:
When finished either reinstall
postgresql94-libs
, or add the alternative back:pip
If you install
psycopg2
withpip
on the other hand, it by default installs precompiled package which comes with its ownlibpq
, which looks for socket in/var/run/postgresql
:The solution is to ask
pip
to not install precompiled package, and makepg_config
of the proper version of PostgreSQL available:You can even add
--no-binary
switch torequirements.txt
:unix_socket_directories
The easier option though is to make use of
unix_socket_directories
option:在我的情况下,使用 conda 安装必须: sudo ln -s /var/run/postgresql/.s.PGSQL.5432 /tmp/.s.PGSQL.5432
In my case with a conda installation had to:
sudo ln -s /var/run/postgresql/.s.PGSQL.5432 /tmp/.s.PGSQL.5432
几年后,在 OSX 10.8 上使用 EnterpriseDB“图形”安装,并使用 pip install psycopg2 (在链接 /Library/...dylib 的 如此处所述之后)我有这个同样的问题。
对我来说,正确的连接命令是
conn = psycopg2.connect('dbname=DBNAME user=postgres password=PWHERE host=/tmp/')
a few years later, using the EnterpriseDB 'graphical' install on OSX 10.8, and pip install of psycopg2 (after linking the /Library/...dylib's as described here) i had this same issue.
for me the correct connect command was
conn = psycopg2.connect('dbname=DBNAME user=postgres password=PWHERE host=/tmp/')
在
brew 升级
后,我遇到了这种情况,我在 google 上搜索了brew .s.PGSQL.5432
。根据这个答案中的建议,我运行了以下命令:
并得到:
我用谷歌搜索了那个致命错误,并根据这个答案我跑了:
这为我解决了问题。
Having this happen to me after a
brew upgrade
, I googled forbrew .s.PGSQL.5432
.Per the suggestion in this answer I ran the following:
And got:
I googled that FATAL error and per the suggestion in this answer I ran:
That solved it for me.
把vpc_access_connector:
名称:project//locations/us-central1/connectors/
和主机:'/cloudsql/::
它应该适用于 gcp 上的私有 Ip postgresql
put vpc_access_connector:
name: project//locations/us-central1/connectors/
and host :'/cloudsql/::
It should work for private Ip postgresql on gcp
尝试一次
更改此
数据库管理登录后的行 通过 Unix 域套接字
本地所有 postgres peer
到
本地所有 postgres md5
然后执行以下命令
Try this once
Change the line after this
Database administrative login by Unix domain socket
local all postgres peer
To
local all postgres md5
Then execute following commands
出现此问题的原因是有时 postgres 连接
localhost-5433 而不是 localhost-5432 作为其他应用程序
可能正在使用该 5432 端口。
试试这个:
This issue arises because sometimes postgres connects on
localhost-5433 instead of localhost-5432 as some other application
might be using that 5432 port.
Try this: